Vlßkna a synchronizace

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, zpracovß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.