Tranzacții cu MySQL

UPDATE USER_ACCOUNT SET Allsum = Allsum + 1000 WHERE id = '1';
UPDATE USER_ACCOUNT SET Allsum = Allsum - 1000 WHERE id = '2';

Acest transfer de fonduri din contul clientului cu numărul de cont de client fata de 2 la numărul 1. Acum, imaginați-vă că prima interogare a executat cu succes, dar al doilea pentru un motiv oarecare (eroare de bază de date, o eroare pe server, și așa mai departe), nu este. Deci, avem o situație care amenință pierderile monetare reale.

Pentru a evita acest lucru, este necesar ca ambele cereri au fost făcute într-o singură bucată. Și dacă a apărut o eroare într-o singură interogare nu va efectua restul. Pentru aceasta a fost inventat și mecanismul de tranzacție.

Operatorul deschide tranzacția în MySQL: "START TRANSACTION;". După tot interogare sau a unei tranzacții poate fi finalizată efectuarea de modificări în baza de date - „COMMIT,“, sau se rostogolească înapoi toate revenirea la starea sa inițială - „ROLLBACK“.

Cu excepția cazului în mod specific ia în considerare cazul unui MySQL, atunci există mai multe capcane.
1. În MySQL, există mai multe tipuri de tabele. Acest ISAM, HEAP, MyISAM, InnoDB, BDB, etc. mecanism tranzacțional suporta numai InnoDB si BDB. Prin urmare, toate tabelele pe care doriți să lucreze prin tranzacția ar trebui să se convertească la tipul corespunzător.
2. În mod implicit, MySQL se execută în modul autocommit. Aceasta înseamnă că rezultatele oricărei SQL declarație, care se schimbă datele vor fi stocate la o dată.

Modul autocommit poate dezactiva SET AUTOCOMMIT = 0 comanda. Dacă dezactivați autocommit modul, fiecare tranzacție trebuie să fie în mod clar complet COMMIT / ROLLBACK.

Astfel, în scopul de a pune în aplicare tranzacția odokratnuyu rezolva problema de la bun început, avem nevoie pentru a executa codul de mai jos:

START TRANSACTION;
UPDATE USER_ACCOUNT SET Allsum = Allsum + 1000 WHERE id = '1';
UPDATE USER_ACCOUNT SET Allsum = Allsum - 1000 WHERE id = '2';
COMMIT;