Od verze 6.1 mohou databßzovΘ aplikace vyu₧φvat soub∞₧n² b∞h vφce vlßken °φzenφ na serveru. Mohou spustit vlßkna, kterß se provßd∞jφ nezßvisle na p°φchodech po₧adavk∙ od klient∙, mohou jim p°edßvat prßci a p°ebφrat v²sledky.
Ka₧d² po₧adavek p°ichßzejφcφ od klienta na server je zpracovßvßn v samostatnΘm vlßkn∞. Pokud po₧adavek vyvolß provßd∞nφ procedury ulo₧enΘ na serveru nebo triggeru, pak mß mo₧nost:
SpuÜt∞nφ dalÜφho vlßkna
DalÜφ vlßkno lze spustit provedenφm p°φkazu:
CALL DETACHED jmΘno_procedury(parametry ... )
Tento p°φkaz vytvo°φ novΘ, tzv. samostatnΘ vlßkno a spustφ v n∞m zadanou proceduru se zadan²mi parametry. Volajφcφ vlßkno pak pokraΦuje nezßvisle dßl, ani₧ by Φekalo na dokonΦenφ tΘto procedury. Jakmile takto zavolanß procedura skonΦφ, je proveden COMMIT
a jejφ vlßkno je zruÜeno.
SamostatnΘ vlßkno vytvo°enΘ p°φkazem CALL DETACHED
se p°ihlßsφ k serveru pod stejn²m u₧ivatelsk²m jmΘnem, jako spouÜt∞jφcφ vlßkno, bude mφt tedy stejn² rozsah prßv. Je-li samostatnΘ vlßkno spuÜt∞nΘ systΘmem, mß administrßtorskß prßva. SpuÜt∞nφm novΘho vlßkna se nespot°ebovßvß ₧ßdnß dodateΦnß licence.
P°i b∞hu samostatnΘho vlßkna bude otev°ena ta aplikace, v nφ₧ se nachßzφ zavolanß procedura.
Procedura zavolanß v samostatnΘm vlßkn∞ smφ mφt pouze vstupnφ parametry. Pokud by m∞la v²stupnφ nebo vstupn∞-v²stupnφ parametry, mohlo by dojφt k pßdu systΘmu, pokud by skuteΦnΘ parametry zanikly p°ed dokonΦenφm procedury - kopφrovßnφ hodnot do v²stupnφch parametr∙ se toti₧ provßdφ a₧ p°i ukonΦenφ procedury, po provedenφ poslednφho p°φkazu. V²sledky Φinnosti procedury se proto typicky zapisujφ do databßze.
PeriodickΘ provßd∞nφ prßce v samostatnΘm vlßkn∞
Pokud samostatnΘ vlßkno mß periodicky provßd∞t urΦitou prßci, pak m∙₧e vyu₧it volßnφ standardnφ funkce Sleep
. Tato funkce mß jeden celoΦφseln² parametr udßvajφcφ poΦet milisekund. Funkce pozastavφ provßd∞nφ procedury, dokud neuplyne zadan² Φasov² interval nebo dokud nenφ ukonΦen SQL server. Pokud funkce skonΦφ uplynutφm intervalu, vrßtφ TRUE, jinak vrßtφ FALSE. Konstrukce, kterß zajistφ periodickΘ opakovßnφ urΦitΘ prßce ka₧d²ch 15 sekund, m∙₧e vypadat takto:
REPEAT
prßce opakovanß s 15-sekundov²mi p°estßvkami
UNTIL NOT Sleep(15000) END REPEAT;
Procedura skonΦφ p°i zastavenφ SQL serveru.
Synchronizovßnφ vlßken pomocφ semafor∙
Pot°eba synchronizovat b∞h vlßken vznikß nap°φklad tehdy, pokud jedno vlßkno p°ipravuje prßci pro jinΘ vlßkno a chce jej probudit k Φinnosti nebo pokud naopak Φekß na dokonΦenφ prßce jin²m vlßknem. Synchonizovat lze kterΘkoli vlßkno s kter²mkoli, bez ohledu ta to, zda b∞₧φ jako samostatnΘ nebo provßdφ po₧adavek klienta a bez ohledu na to, kter²m klientem (resp. systΘmem) bylo spuÜt∞no.
K synchronizaci vlßken slou₧φ semafory oznaΦenΘ jmΘny. Vlßkno, kterΘ chce pracovat se semaforem, zadß jeho jmΘno a obdr₧φ celoΦφseln² handle semaforu. Pokud dv∞ vlßkna pou₧ijφ stejnΘ jmΘno semaforu, obdr₧φ handle ke stejnΘmu semaforu a mohou jej pou₧φt k synchronizaci.
Semafor se vytvß°φ pomocφ funkce Create_Semaphore
, vstupnφ parametry urΦujφ jmΘno semaforu a pro kolik vlßken bude po vytvo°enφ otev°en. Semafor se ruÜφ pomocφ funkce Close_Semaphore
, ke skuteΦnΘmu zruÜenφ semaforu vÜak dojde a₧ tehdy, kdy₧ jej zruÜφ vÜechna vlßkna, kterß s nim pracujφ. Operaci zvednutφ semaforu provßdφ funkce Release_Semaphore
, atomickou operaci Φekßnφ na zvednut² semafor a nßslednΘ spuÜt∞nφ semaforu provßdφ funkce Wait_For_Semaphore
.
P°φklad:
Nech¥ prvnφ vlßkno p°ipravuje prßci pro druhΘ vlßkno a Φekß na jejφ dokonΦenφ. Prvnφ vlßkno m∙₧e vypadat takto:
DECLARE nova_prace, prace_hotova INT; SET nova_prace = Create_Semaphore("nova prace", 0); SET prace_hotova = Create_Semaphore("prace hotova", 0);
... // p°φprava prßce pro druhΘ vlßkno
CALL Release_Semaphore(nova_prace); CALL Wait_For_Semaphore(prace_hotova, -1); ... // prßce je hotova, zpra
covßnφ v²sledk∙
CALL Close_Semaphore(nova_prace); CALL Close_Semaphore(prace_hotova);
DruhΘ vlßkno m∙₧e vypadat takto:
DECLARE nova_prace, prace_hotova INT;
SET nova_prace = Create_Semaphore("nova prace", 0);
SET prace_hotova = Create_Semaphore("prace hotova", 0);
LOOP
CALL Wait_For_Semaphore(nova_prace, -1);
IF konec THEN LEAVE;
END IF;
... // provedenφ prßce
CALL Release_Semaphore(prace_hotova);
END LOOP;
CALL Close_Semaphore(nova_prace);
CALL Close_Semaphore(prace_hotova);
╚innost druhΘho vlßkna se ukonΦφ tak, ₧e se nastavφ podmφnka konec a provede se p°φkaz:
CALL Release_Semaphore(nova_prace);
Tento model spoluprßce dovoluje, aby druhΘ vlßkno m∞lo v∞tÜi rozsah prßv, ne₧ prvnφ. Pokud prvnφ vlßkno chce provΘst akce, k ni₧ nemß dostateΦnß oprßvn∞nφ, musφ o n∞ po₧ßdat druhΘ vlßkno.
P°φklad:
Nech¥ existuje skupina p°φkaz∙, kterou smφ v jednom okam₧iku provßd∞t nejv²Üe jedno vlßkno. Tento po₧adavek lze zajistit uzav°enφm p°φkaz∙ to takovΘto konstrukce:
DECLARE chrßn∞nß_sekce INT;
SET chrßn∞nß_sekce = Create_Semaphore("chrßn∞nß sekce", 1);
CALL Wait_For_Semaphore(chrßn∞nß_sekce, -1);
... // p°φkazy
CALL Release_Semaphore(chrßn∞nß_sekce);
CALL Close_Semaphore(chrßn∞nß_sekce);
Pokud vlßkno opomene zruÜit semafor, SQL server jej zruÜφ p°i ukonΦenφ vlßkna.
Spoluprßce vlßken a transakce
Pokud jedno vlßkno provede zm∞ny v databßzi a chce, aby zm∞n∞nß data byla viditelnΘ pro jinß vlßkna, musφ provΘst explicitnφ COMMIT
. Jinak, v zßvislosti na nastavenΘm stupni izolace transakcφ, budou ostatnφ vlßkna bu∩ vid∞t dosud nezm∞n∞nß data nebo budou pozastavena do dokonΦenφ transakce prvnφm vlßknem.
Je-li nastaven stupe≥ izolace REPEATABLE READ
nebo SERIALIZABLE
, pak pokud vlßkno p°eΦetlo jistß data a chce umo₧nit jin²m vlßkn∙m tato data p°epsat, musφ provΘst explicitnφ COMMIT
a bez ohledu na to, k²m bylo spuÜt∞no.