[ --ja-- @ 03.04.2015. 21:12 ] @
Pozdrav svima.

Pokušavam napraviti neke generičke procedure za CRUD operacije, zapravo nije bitno zašto.. Uglavnom više-manje stalno radim sa Sql Serverom (dakle TSQL), pa su mi stvari oko MySQL-a prilično nepoznate.

Na kraju sam uspio dobiti rezultat koji me zanimao, međutim muči me jedna stvar: u MySQL-u da bih napravio dinamički upit moram koristiti user-defined varijable. Koliko shvaćam, te varijable žive sve dok je session otvoren.

Ako imam slijedeću proceduru:
Code:
CREATE DEFINER=`root`@`localhost` PROCEDURE `generic_GetEntity`(
    in `Schema` varchar(128),
    in TableName varchar(128),
    in PkValue int
)
BEGIN
    declare LSchemaName varchar(128);
    declare LTableName varchar(128);
    declare PkColName varchar(128);
    declare stmt varchar(4000);
    
    select
          t.table_name collate utf8_unicode_ci
        , k.COLUMN_NAME collate utf8_unicode_ci
        , t.table_schema collate utf8_unicode_ci
    into
          LTableName
        , PkColName
        , LSchemaName
    from
        information_schema.table_constraints t
        left join information_schema.key_column_usage k using(constraint_name, table_schema, table_name)
    where t.constraint_type='PRIMARY KEY'
        and t.table_schema=`Schema` collate utf8_general_ci
        and t.table_name=TableName collate utf8_general_ci;

    if LTableName is null then
        signal sqlstate '45000' set message_text = 'Table not found!';
    end if;

    set stmt = CONCAT( 'select v.* from `', LSchemaName, '`.`', LTableName, '` as v where v.`', PkColName, '` = ?' );
    
    set @getEntityStatement := stmt;
    set @getEntityPkValue := PkValue;
    
    prepare getEntityStatement from @getEntityStatement;
    execute getEntityStatement using @getEntityPkValue;
    deallocate prepare getEntityStatement;
END


postoji li opasnost da se paralelno unutar istog sessiona (nekakav multithreading ili slično) izvrši ta procedura više puta paralelno u okviru istog sessiona, te da jedan poziv te procedure utječe na rezultat drugog u smislu da prebriše neku od user-defined varijabli u nekom nezgodnom trenutku (nakon neke od set operacija)?


Hvala!
[ bogdan.kecman @ 04.04.2015. 00:26 ] @
Citat:
--ja--
postoji li opasnost da se paralelno unutar istog sessiona (nekakav multithreading ili slično) izvrši ta procedura više puta paralelno u okviru istog sessiona


ne postoji nacin da u jednom session-u radis bilo sta paralelno.
jedan session == 1 konekcija == 1 thread.
ne mozes da pozoves drugi upit u istoj konekciji/session-u dok se prvi ne zavrsi

ako se ja dobro secam identicno je i za MSSQL i za PGSQL i za OracleDB i ... samo neki od njih mogu od tebe u konektoru (posebno ako cukas .not on otvara nove sesije ko lud i gde treba i gde ne treba) da sakriju to sto su otvorili novu sesiju ali unutar jedne sesije stvari idu sekvencijalno i tamo