Tranzacții în mysql 2
1. Situația problemei
Pentru lecția de azi, am pregătit doar o astfel de pagină HTML:


Cadrul YII2. Dezvoltarea rapidă a cadrelor moderne PHP
Explorați moderne subtilitățile cadru de dezvoltare web folosind YII2
După cum puteți vedea - este doar o pagină a unui magazin online. Și anume de afișare a paginii de bunuri din catalog - o unitate centrală, și coșul, care conține deja mai multe produse.
De fapt, - aceasta este o pagină statică, și, desigur, mecanismul de a adăuga produse în coșul de cumpărături nu funcționează, pentru că subiectul lecției este diferit. Cu toate acestea, trei produse, care sunt afișate într-un coș - salvat în sesiune, iar dacă faceți clic pe link-ul „Checkout“, ordinul pentru achiziționarea acestor bunuri vor fi emise. Doar un exemplu de ordonare a mărfurilor pentru tine, vom vedea beneficiile utilizării tranzacției cu baza de date. Dar, înainte de asta, să ne uităm la modul în care site-ul de testare.
Deci, tot conținutul site-ului de testare este conținută în baza de date, și anume în tabelul revista. De asemenea, baza de date conține trei tabele - otpravleno, user_cash, zakazi.
Tabelul otpravleno - utilizat pentru plătit și, ca în cazul în care comenzile trimise (din nou virtuale) tabel user_cash - magazine cu mijloace virtuale de utilizator ca și în cazul în care pe site-ul nostru sunt virtuale banii pe care pot plăti pentru mărfurile (acest lucru este necesar doar ca un exemplu), și în cele din urmă, tabelul zakazi -toate pentru a comanda on-line.
Aceasta este, procesul de comanda este redus la punerea în aplicare consecventă a mai multor interogări SQL la baza de date: adăugarea unui tabel zakazi - cu privire la comandarea de date de proces, retragerea de fonduri din partea utilizatorului pentru bunurile achiziționate (de exemplu, schimbarea datelor din tabelul user_cash), adăugarea unui tabel de date otpravleno despre plătit pentru bunuri, și în cele din urmă schimba numărul de produse din stoc (adică, reducerea numărului de produse din tabelul revista care au fost achiziționate).
Desigur, într-un magazin real, astfel de cereri nu sunt îndeplinite, dar pentru această lecție, un exemplu va fi doar în timp.
Acum, haideți să aruncăm o scurtă privire la codul sursă al site-ului.
Deci, baza logica a site-ului - este fișierul functions.php, care descrie toate funcțiile necesare pentru funcționarea site-ului.
Pe scurt despre fiecare caracteristică:
connect_db - o funcție care se conectează la baza de date.
get_goods - o funcție care dobândește, dintr-o bază de date a datelor de produs și o returnează ca o matrice.
get_cart - o funcție care stochează primele trei sesiuni ale bunurilor din baza de date (la fel ca un exemplu, care ar fi în cazul în care procesul de verificare).
zakaz - Comandarea funcției. Această funcție secvențial execută interogări la baza de date la care am făcut referire mai sus date.
De asemenea, o parte din codul sursă sunt cart.php index.php și fișiere, dar codul lor, nu voi da acum, pentru că este foarte simplu. Aceste fișiere pot fi găsite în codul sursă pentru această lecție.
Din toate cele de mai sus ar trebui să fie - pentru care ar face-o comandă care ar avea nevoie pentru a efectua interogări SQL fără erori în funcția zakaz. Dar imaginați-vă următoarea situație: de exemplu, utilizatorul a selectat produse pentru achiziție făcând clic pe Checkout și începe executarea zakaz funcția, care este executat prima interogare - salva datele de comandă, apoi a doua - a scrie off de fonduri din contul utilizatorului (modifica datele din tabel user_cash), dar eroarea apare atunci când executați a treia solicitare. Ce se întâmplă dacă acest lucru se dovedește - un ordin emis, banii retrași din contul utilizatorului, dar mărfurile nu au fost transferate la expediere. Sunt de acord situație destul de neplăcută. Deci, să găsească o soluție la această problemă.
2. Ce este o tranzacție?
Tranzacție - este o secvență de diferite interogări SQL care se execută ca un întreg, și să nu fie întrerupt de către alți clienți. Aceasta este, atunci când interogări sunt tranzacții executate, acces la înregistrările nimeni nu poate obține.
Putem mulțumim tranzacțiile pentru a crea un grup de interogări care sunt garantate pentru a fi executate fără erori. Dacă în timpul executării unei tranzacții eșuează sau apare o eroare, rezultatele tuturor cererilor la locul de origine al erorii este anulat. Astfel, starea bazei de date este returnat la original - până la cererile de tranzacție.
De exemplu, dacă aveți nevoie pentru a efectua rând 100 interogări SQL și sunteți în același timp, folosind tranzacția, apoi, dacă în cursul acestor cereri cel puțin una dintre ele nu are succes, sau nu executat deloc - starea bazei de date va reveni la starea inițială - în momentul punerii în aplicare a acestor cereri. Numai după finalizarea cu succes a ultimei cereri de 100 de ani orice modificare produce efecte.
Esența tranzacției este cea care este dezactivat de interogarea de confirmare implicită, adică, după ce baza de date de interogare va aștepta un mesaj special pentru a confirma executarea cu succes a cererii - mesajul comite. Odată ce acest mesaj este primit - modificările în vigoare. Dacă vom trimite un mesaj la o bază de date derulare înapoi - se va rostogoli înapoi toate modificările (anulare) în baza de date la începutul tranzacției.
Tranzacțiile efectuate prin menținerea unui jurnal al tuturor modificărilor aduse bazei de date în cazul în care funcționarea fiecărei tranzacții. Când reveniți modificările, baza de date se referă la revista și anulează toate cererile făcute la tranzacție curentă.
3. Aplicarea tranzacției la script-ul de test
Deci, pentru că ar începe să lucreze cu tranzacții, primul lucru pe care doriți să anulați confirmarea automată a executa interogări SQL la baza de date. Pentru a face acest lucru, folosiți funcția:
Vreau să rețineți că, în scopul de a lucra cu baza de date folosesc limbajul mysqli extensia php ca o extensie MySQL este deja semnificativ de actualitate, și nu conține, funcții pentru lucrul cu tranzacții. O notă importantă: pentru a lucra cu tranzacția trebuie să utilizeze tabele InnoDB în tipul de date, tipul de MyISAM - tranzacția nu este acceptată.
În plus, după fiecare cerere trebuie să fie verificate - în cazul executat cu succes solicitarea, în cazul în care există o eroare, atunci imediat ar trebui să trimită o bază de date mesaj rollback toate modificările. Pentru a face acest lucru, folosiți funcția:
Dacă sunteți sigur că toate cererile sunt finalizate cu succes - astfel încât să puteți trimite mesajul commit - confirmarea tranzacției:
Acum, să schimbe funcția zakaz astfel încât trimiterea și executarea de interogări efectuate prin tranzacții.
După cum vedeți, am transporta toate lucrurile pe care le-am menționat mai sus, adică, dezactivați-comite interogări este executat (mysqli_autocommit ($ db, FALSE)), apoi, după fiecare solicitare de verificări pentru identificarea erorilor, în cazul în care există erori sub formă de rulouri imediat înapoi toate modificările (mysqli_rollback ( $ db)). De asemenea, este important să își îndeplinească funcțiile, în acest caz, o întoarcere simplă (retur), pentru că în cazul în care cererea se face cu o eroare, nu are sens să continue executarea de cod zakaz funcție. În cazul în care toate solicitările sunt, vom confirma tranzacția (mysqli_commit ($ db);).
Înainte de a verifica afară, vă sugerez zakaz funcția descrisă într-un alt mod, și anume, de a utiliza un bloc try-catch pentru a testa interogarea. Permiteți-mi să vă reamintesc că blocurile try-catch - punerea în aplicare a mecanismului de manipulare excepții în PHP.
A se vedea toate ciclul de cod, concluzionăm într-un bloc try, iar fiecare bloc, dacă (te) și pot genera o excepție. Adică, atunci când sunt executate, cel puțin o unitate în cazul în care, odată ce o excepție este aruncată și script-ul va fi redirecționat imediat la blocul de captură, care, la rândul său, și se rostogolesc înapoi toate modificările. Dacă totul merge bine, și dacă nici unul dintre blocurile nu sunt executate, astfel încât trebuie doar să confirme o tranzacție, facem de fapt.
Acum să făcut în mod deliberat o greșeală într-una dintre cererile și să execute script-ul. După cum puteți vedea, dacă executați o interogare eroare apare, atunci imediat există o revenire a tuturor modificărilor și a restabili baza de date la starea inițială. Asta este tot de lucru cu succes. Deci, dacă aveți nevoie pentru a efectua unele interogări foarte critice de baze de date, utilizați întotdeauna tranzacția pentru a evita consecințele neplăcute ale erorilor care apar.
Cu aceasta închei această lecție, tot ce bine și vedeți în următoarele lecții.
Cele mai multe știri IT si dezvoltare web pe canalul nostru-Telegram