mysql – transakce, zamykani tabulek
- Vladik_hk
- Člen | 50
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
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.