declarațiile de control și tranzacții de blocare MySQL - HTML, CSS, JavaScript, Perl, PHP, MySQL
Sintaxa START TRANSACTION, revocați COMMITi
operatorii kotoryenelzyaotkatit
Pentru unii operatori nu pot fi rulate înapoi de un ROLLBACK. Acestea includ datele referitoare la situațiile lingvistice definiție (definiție date lingvistice - DDL), care creează și distruge baze de date, precum și să creeze, să șteargă și să modificați tabelul.
Ar trebui să proiecteze tranzacțiile, astfel încât acestea nu au inclus acești operatori. Dacă introduceți un operator de la începutul tranzacției, care nu poate fi patinat, iar apoi următoarea declarație va eșua mai târziu, efectul complet al tranzacției nu poate fi anulat ROLLBACK.
operatorii vyzyvayuschieneyavnyyCOMMIT
Următorii operatori sunt completate implicit de tranzacție (ca și în cazul în care înainte de execuție a fost emisă COMMIT):
TABELE DESCĂTUȘEAZĂ se termină, de asemenea, o tranzacție în cazul în tabele au fost blocate. Înainte de a MySQL 4.0.13 CREATE TABLE se încheie o tranzacție în cazul în care înregistrarea binară va fi inclusă.
Tranzacțiile nu pot fi imbricate. Aceasta este o consecință a implicitului COMMIT efectuate pentru orice tranzacție curentă atunci când o declarație de start tranzacție sau sinonimele acestuia.
6.4.4.Sintaksis SAVEPOINTi ROLLBACK TO SAVEPOINT
identificator SAVEPOINT
ROLLBACK TO SAVEPOINT identificator
Începând cu versiunea MySQL 4.0.14 și 4.1.1, InnoDB sprijină SAVEPOINT SQL declarații și ROLLBACK TO SAVEPOINT.
SAVEPOINT stabilește un punct numit a tranzacției a început cu numele identificatorului. În cazul în care tranzacția curentă are un punct de salvare cu același nume, vechi este șters și un nou set.
ROLLBACK operatorului să SAVEPOINT rostogolește înapoi tranzacția la punctul de salvare numit. Modificările rânduri că tranzacția curentă efectuate după acest moment sunt aruncate înapoi, dar nu elimina InnoDB încuietori rând care au fost instalate în memorie după punctul de salvare. (Rețineți că, pentru rând nou inserat informațiile de blocare bazat pe identificatorul de tranzacții stocate în rândul, blocarea nu este stocată în memorie separat. În acest caz, rândul este deblocat cazuri.) Savepoints stabilite la cel mult un punct numit, eliminat.
În cazul în care declarația returnează următoarea eroare, aceasta înseamnă că punctul de salvare numit nu există:
EROARE 1181: Am eroare 153 în timpul ROLLBACK
Toate tranzacția savepoints sunt șterse dacă executați un COMMIT sau ROLLBACK fără a specifica numele punctului de salvare.
Sintaxa TABLESi LOCK DEBLOCARE TABELE
Pe de altă parte, în cazul în care masa este blocată de un alias, trebuie să se refere la acesta cu alias:
mysql> LOCK TABLE t AS myalias CITEȘTE LISTA;
mysql> SELECT * SHZH t;
EROARE 1100: Tabelul CH1 nu a fost închis cu TABELE LOCK
mysql> SELECT * FROM T AS myalias;
Scrie blocare (SCRIERE) au de obicei o prioritate mai mare decât citirea blocului (citire), pentru a se asigura că actualizarea va avea loc cât mai curând posibil. Acest lucru înseamnă că, dacă un fir obține un sistem de blocare READ și apoi un alt fir cere un sistem de blocare SCRIE, cereri de blocare ulterioare de citire va aștepta până când este instalat și îndepărtat printr-un blocaj de scriere. Puteți utiliza blocarea pentru înregistrarea cu prioritate redusă (LOW_PRIORITY WRITE), pentru a permite altor fire să se stabilească de blocare în lectură până când firul curent este în așteptare pentru posibilitatea de a pune un sistem de blocare pe înregistrare. Trebuie să instalați LOW_PRIORITY SCRIE blochează numai atunci când sunteți sigur că serverul rulează va fi un moment în care nici un thread nu va ține de blocare pentru citire.
TABELE LOCK funcționează după cum urmează:
- Într-o ordine internă sortate toate tabelele care urmează să fie blocate. Din punct de vedere utilizator, această comandă nu este definită.
- Dacă tabelul este blocat, și de lectură și de înregistrare, setați blocarea înainte de a scrie de blocare de citire.
- Blochează o masă la un moment dat, atâta timp cât firul devine toate blocările.
Dacă utilizați LOW_PRIORITY SCRIE blochează pe o masă, aceasta înseamnă doar că MySQL va aștepta momentul în care nu va exista nici un flux, care dorește să stabilească un sistem de blocare de citire. Atunci când un fir nu se poate instala o blocare de intrare de masă, și se așteaptă să fie în măsură să blocheze următorul tabel din listă, toate celelalte fire vor fi suspendate, atâta timp cât dispozitivul de blocare de înregistrare este eliberat. Dacă aceasta este o problemă serioasă pentru cererea dumneavoastră, ar trebui să ia în considerare conversia unele din tabele în formă netran-zaktsionnuyu.
Puteți utiliza în condiții de siguranță ucide pentru a întrerupe fluxul, care se așteaptă ca un sistem de blocare de masă. A se vedea. Secțiunea 6.5.4.3.
Rețineți că nu trebuie să blocheze orice tabele ale celor care efectuează INSERT INTARZIERE“, deoarece în acest caz, insertul este realizată fir server separat.
De obicei, nu trebuie să blocheze tabele, ca toate declarațiile INSERT individuale sunt atomice - adică, nici un alt fir poate interfera cu executarea în prezent SQL declarație. Cu toate acestea, există cazuri în care tabelele de blocare încă trebuie să:
- Dacă aveți de gând să ruleze mai multe operații pe un set de tabele MyISAM, este mult mai rapid în cazul în care pre-blocului lor. Blocarea tabelelor MyISAM accelerează introducerea, actualizarea sau ștergerea lor. Dezavantajul acestui fapt este că nici un flux nu poate actualiza tabelul de citire blocat (inclusiv cea care a stabilit blocarea) și nici unul dintre fluxul nu poate primi nici un acces la un tabel de înregistrări blocate, cu excepția debitului stabilit de blocare.
Motivul pentru care unele operații sunt mai rapide pe mese MylSAM blocate, datorită faptului că MySQL nu deversa indicele cache pentru aceste tabele până atunci, până când aceasta se numește TABELE Unlock. De obicei, memorii cache de index sunt resetate după fiecare SQL declarație. - Dacă utilizați un motor de stocare în MySQL, care nu acceptă tranzacții, trebuie să emită o TABELE LOCK, dacă doriți să se asigure că nu există alte declarații vor fi emise între SELECT și UPDATE. Exemplul de mai jos necesită TABELE LOCK pentru performanța în condiții de siguranță:
mysql> LOCKTABLEStransREAD, customerWRITE;
. Mysql> SUM SELECT (valoare) DIN WHEREcustomer_2.6 trans = id;
mysql> Clienți UPDATE
-> = SEToa1_ua1e summa_iz_predtstsusch<2го_оператора
-> WHEREsizoteg_1<к=идентификатор; mysql> DEBLOCARE TABELE;
Fără TABELE LOCK, există posibilitatea ca un alt fir ar putea introduce un nou rând în tabelul de trans între executarea SELECT și actualizarea.
Puteți evita folosirea TABELE LOCK, în multe cazuri, folosind actualizări relative (UPDATE clienților Valoarea SET = valoarea + NEW_VALUE), sau funcția LAST_INSERT_ID (). Cm. Tranzacții de partiționare și operații atomice
încuietori de masă pot fi evitate, în unele cazuri, prin utilizarea GET_LOCK funcții la nivel de utilizator () și RELEASE_LOCK (). Aceste încuietori sunt salvate în tabelul hash server și pus în aplicare pentru pthread_mutex_lock apel de viteză () și pthread_mutex_unlock (). Cm. Partitionati Diverse funcții
Puteți bloca în lectura toate tabelele din toate tabelele de la același nivel de operator baze de date cu citire LOCK. A se vedea. TABELE RazdelSintaksis Blocați și deblocați TABELE Acesta este un mod foarte convenabil de a obține copii de rezervă în cazul în care lucrați cu un sistem de fișiere, cum ar fi Veritas, care poate face instantanee în timp.
Nazametku%! Dacă utilizați ALTER TABLE pe un tabel blocat, acesta poate fi deblocat. Cm. Probleme despartiturilor cu ALTER TABLE
Sintaxa SET TRANSACTION
SET [GLOBAL | SESIUNE] NIVEL DE TRANZACȚIE IZOLAREPuteți seta, de asemenea, nivelul inițial de izolare la nivel mondial pentru serverul mysqld rulând cu opțiunea -transaction-izolare