mysql – transakce, zamykani tabulek

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Vladik_hk
Člen | 50
+
0
-

Ahoj, mam zacatenicky dotaz k transakcim a zamykani tabulek, jedna se o mysql a aplikaci v php. Konkretne mi jde o to, pokud nezavisle na sobe spoustim z vice mist skript na zpracovani dat, jak pri tom zajistit aby nektera data nebyla zpracovana dvakrat?

Dam priklad. Napr. mam objednavky v e-shopu, ze kterych vypocitavam napr. celkovou sumu penez za objednaneho zbozi ze vsech objednavek od zacatku fungovani e-shopu. Tento vypocet provedu vzdy v okamziku, kdy pribyde urcity pocet objednavek. Abych nemusel vzdy pocitat vsechny objednavky od okamziku zahajeni cinnosti e-shoupu, davam si k objednavce do tabulky priznak „je_zahrnuta_v_souhrnnem_vypoctu“. V okamziku, kdy tedy spustim fci na vypocet celkove sumy objednavek, nactu si jen objednavky, ktere maji tento priznak 0 a po provedeni vypoctu jim nastavim priznak 1. A takto to jde porad dokola s novymi objednavkami.

Ted jdu k jadru me otazky. Problem je, ze tu fci na vypocet celkove sumy objednavek je mozne z ruznych duvodu spoustet z nekolika mist aplikace (podle splneni podminek) a muze se teoreticky i stat, ze tato fce bude spustena ze 2 mist aplikace soucasne. A tady mam obavu aby napr. nedoslo vicekrat ke zpracovani stejnych objednavek. Tedy napr. v ramci prvniho procesu sice dojde u novych objednavek k nastaveni priznaku „je_zahrnuta_v_souhrnnem_vypoctu“ na 1, ale az po te co v ramci druheho procesu uz byly nove objednavky podle tohoto priznaku opetovne nacteny pro zpracovani tou samou fci. Vim, ze se jedna o zakladni veci ve vztahu k transakcim a zamykani, a budu vdecny za vysvetleni pripadne nasmerovani. Diky.

blacksun
Člen | 177
+
0
-

No tohle ti vyřeší transakce, např. s použitím dibi nějak takto:

<?php

// pripojeni
// ...

// transakce start
dibi::begin();

// vypocet
dibi::query('SELECT ... ');
// slozity vypocet a ulozeni
dibi::query('UPDATE ... ');

// commit
dibi::commit();

?>

Tohle pak ceka na commit a pokud se to spusti nahodou vickrat, tak pokud se zmeni data za behu jednoho „spusteni“, druhe se rollback-ne.