Tranzacții cu MySQL și Oracle

Tranzacție - unul dintre conceptele fundamentale care disting baza de date din sistemul de fișiere regulate și dintr-un simplu set de tabele.

Tranzacție - un grup secvențial executate declarații SQL, care sunt fie să fie efectuate toate sau nu ar trebui să se facă nici una dintre ele. Obiectivul principal al tranzacției - pentru a asigura integritatea datelor atunci când mai multe SQL declarație este executată independent de fiecare alte modificări de informații. Un exemplu clasic citat, probabil, în toate manualele bazelor de date - transferul de bani de la un cont la altul:

Conturile UPDATE SET AccSum = AccSum - 1000 UNDE AccNumber = 12345;
conturi UPDATE SET AccSum = AccSum + 1000 = UNDE AccNumber 67890;

Ce se întâmplă în cazul în care prima declarație este executată, iar al doilea pentru un motiv oarecare - nu (eșecul de server, numărul de cont greșit, supraplin -. Greșeala poate fi mică dacă este cazul)? Bani dintr-un cont în scris off, în timp ce celălalt nu.

Mecanismul de tranzacție este tocmai capacitatea de a obține în mod corect de astfel de situații. Prin combinarea acestor două declarații UPDATE într-o singură tranzacție, ne vom asigura punerea în aplicare a (sau eșecul) ambele în ansamblu.

SQL standard-92 prevede că o tranzacție în sesiunea curentă începe în mod implicit, atunci când primul dintre interogări SQL care modifică datele și completate pot fi fie în mod explicit - operatori [WORK] sau ROLLBACK COMMIT (COMMIT [WORK] confirmă tranzacția și înregistrează modificările, ROLLBACK rostogolește înapoi tranzacția și returnează datele din baza de date la starea în care au fost înainte de începerea tranzacției), sau implicit - la încheierea sesiunii curente sau eroare de sistem. Din păcate, standardul SQL-92 nu definește ceea ce trebuie făcut în mod implicit, la sfârșitul sesiunii curente - tranzacția de confirmare sau revocați și în diferite baze de date (și chiar, uneori, în clienți diferiți pentru același SGBD) este pus în aplicare în mod diferit. Prin urmare, acțiunea implicită este mai bine să nu se bazeze întotdeauna comiți / ROLLBACK în mod clar.

Tranzacții cu Oracle

Vorbind despre mecanismul de tranzacții în Oracle, unul ar fi, probabil, limitată la o singură propoziție: „Tranzacții cu Oracle aproape satisface complet standardul SQL-92 - a se vedea paragraful precedent“. Am adăuga la aceasta, doar poate, două puncte.

Read-only tranzacții

Cei care, cu toate acestea, oferă, de asemenea, un standard SQL-92. În cazul în care tranzacția este declarată drept „read-only“ (SET TRANSACTION numai în citire) - acest lucru asigură că toate SELECT, a făcut ca parte a acestei tranzacții, va da probe în aceeași stare în care au fost la începutul tranzacției. În cadrul tranzacției „read-only“ interzise orice modificare a datelor. În acest caz, tranzacția este „read-only“ locuri nici o blocare a datelor și nu împiedică modificarea acestor date la alte sesiuni.

tranzacții autonome

Implementat în mecanismul Oracle pentru tranzacții autonome pentru a crea o nouă tranzacție în curent. Confirmare / roll înapoi modificările efectuate în cadrul tranzacției autonome se realizează în mod independent de tranzacția părinte. tranzacții autonome pot fi imbricate, nivelul maxim de imbricare este determinat setările de server.

Tranzacții cu MySQL

Dar, în MySQL, cu o tranzacție este mult mai complicată.

Să începem cu faptul că, în MySQL, există mai multe tipuri de tabele: ISAM, HEAP, MyISAM, InnoDB, BDB. Dintre aceste tranzacții pot sprijini doar ultimele două: InnoDB și BDB. Astfel, „nativ“ pentru MySQL sunt tabele de tip MyISAM care nu acceptă tranzacția. Și pentru a putea crea un tranzacțional tipuri de masă InnoDB și BDB și să lucreze cu ei, serverul MySQL trebuie să fie configurat corect (care nu este întotdeauna în puterea de dezvoltatorii de aplicații, în special a aplicațiilor web).

În mod implicit, MySQL se execută în modul autocommit. Aceasta înseamnă că rezultatele oricărei SQL declarație, care se schimbă datele vor fi fixate imediat (scris pe disc).

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.

Pentru o singură trecere în modul tranzactional puteți utiliza TRANZACȚIE START (în MySQL de la versiunea 4.0.11) sau BEGIN [WORK]:

START TRANSACTION;
Conturile UPDATE SET AccSum = AccSum - 1000 UNDE AccNumber = 12345;
conturi UPDATE SET AccSum = AccSum + 1000 = UNDE AccNumber 67890;
COMMIT;

Să acorde o atenție la un deznodamant serios. În cazul în care tranzacția implică un tabel de diferite tipuri (tranzacționale și non-tranzacționale), atunci ei s-ar comporta foarte diferit. Modificări la tabele care nu implică tranzacții vor fi făcute imediat, în ciuda modului autocommit cu handicap, și va fi imposibil să se rostogolească înapoi folosind instrucțiunea ROLLBACK! Și dacă ROLLBACK fi făcute încă - modificările aduse la masa de tranzacție, revocați și non-tranzacționale - vor rămâne. Pentru ceea ce poate duce - Cred că nu este necesar să mestece.