Transakce v MySQL a PHP: Pokud nezavoláte rollback, máte zaděláno na pořádný průšvih

Při práci s transakcemi v MySQL se občas můžeme zamotat do jejich volání. START TRANSACTION považujme za párový příkaz, po kterém by mělo být vždy zavoláno COMMIT nebo ROLLBACK. Jinak máte zaděláno na velký problém.

 

Když v jedné funkci A zahájíte novou transakci pomocí příkazu START TRANSACTION a následně pomocí SQL příkazu něco změníte v databázi, změna se samozřejmě neprovede – protože jste nezavolali příkaz COMMIT pro vykonání transakce.

START TRANSACTION;
UPDATE shop SET ...

Kód ale ještě pokračuje. Následně zavoláte funkci B, kde zahájíte (jinou) transakci START TRANSACTION a opět další SQL příkazy pro vykonání třeba úplně jiné operace.

START TRANSACTION;
UPDATE permition SET ...
ROLLBACK;

Víte, co se stane?

Protože jste transakci z funkce A nezrušili pomocí ROLLBACKu (v rámci jednoho spojení), tak se kvůli zahájení druhé transakce ve funkci B provedou všechny SQL příkazy z funkce A. Což to jste určitě nechtěli.

Ukončujte každou transakci

Rada tedy zní: Když zahájíte transakci, vždy ji ukončete příkazem COMMIT nebo ROLLBACK, ať se vám databáze nepřepisuje pod rukami.

START TRANSACTION;
UPDATE shop SET ...
ROLLBACK nebo COMMIT

START TRANSACTION;
UPDATE permition SET ...
COMMIT;

Hledání takových chyb je pak oříšek, protože se nejedná o typickou syntaktickou chybu.




Leave a Reply