Ghidul de referință Mysql

6.7.2. Sintaxa comenzilor TABLURI LOCK / UNLOCK TABLES

Comanda LOCK TABLES blochează tabelele specificate pentru acest flux. Comanda UNLOCK TABLES elimină toate blocările deținute de acest thread. Toate tabelele care sunt blocate de firul curent sunt deblocate automat atunci când o altă comandă LOCK TABLES apare în flux sau atunci când conexiunea la server este deconectată.







Pentru a utiliza comanda LOCK TABLES în MySQL 4.0.2, trebuie să aveți tabele globale LOCK TABLES și SELECT pentru tabelele specificate. În MySQL 3.23, aceasta necesită privilegii SELECT. INSERT. DELETE și UPDATE pentru tabelele în cauză.

Principalele avantaje ale comenzii LOCK TABLES sunt că vă permite să emulați tranzacții sau să obțineți o viteză mai mare la actualizarea tabelelor. Acest lucru este explicat mai detaliat mai jos.

Diferența dintre READ LOCAL și READ este că READ LOCAL vă permite să executați comenzi INSERT non-conflictuale în timpul existenței unei blocări. Cu toate acestea, această comandă nu poate fi folosită pentru a lucra cu fișiere de baze de date în afara serverului MySQL în timpul acestei blocări.

Când utilizați comanda LOCK TABLES, trebuie să blocați toate tabelele pe care intenționați să le utilizați în interogările ulterioare, în timp ce utilizați aceleași pseudonime care vor fi în interogări! Dacă tabelul este menționat de mai multe ori în interogare (cu aliasuri), trebuie să blocați fiecare alias!

Blocarea WRITE are de obicei o prioritate mai mare decât o blocare READ. Pentru a vă asigura că modificările sunt procesate cât mai repede posibil. Aceasta înseamnă că, dacă un fir primește un blocaj READ și apoi un alt fir solicită o blocare WRITE. solicitările ulterioare de blocare READ vor aștepta până când firul WRITE va primi o blocare și îl va șterge. Puteți utiliza încuietori LOW_PRIORITY WRITE. permițând altor fire să primească încuietori READ în timp ce firul principal așteaptă blocarea WRITE. Blocările LOW_PRIORITY WRITE pot fi utilizate numai dacă există o certitudine că în cele din urmă va exista o perioadă de timp în care niciuna dintre fire nu va avea o blocare READ.

Comanda LOCK TABLES funcționează după cum urmează:

Sortează toate tabelele blocate într-o ordine specificată intern, adică `` cusute '' (din punctul de vedere al utilizatorului, această comandă nu este specificată).

Blocarea WRITE este plasată înaintea blocării READ. dacă mesele sunt blocate cu blocări READ și WRITE.

Blochează câte o masă, până când firul primește toate încuietorile.







Ordinea descrisă de acțiuni asigură faptul că blocarea tabelului nu creează un blocaj. Cu toate acestea, există alte lucruri pe care ar trebui să le cunoașteți atunci când lucrați la schema descrisă:

Folosind LOW_PRIORITY WRITE pentru tabela de blocare pur și simplu înseamnă că MySQL va efectua această blocare specială până când apare un fir care solicită o blocare READ. Dacă firul primește o blocare WRITE și așteaptă ca tabelul următor să fie blocat din lista tabelelor blocate, toate celelalte fire vor aștepta până când se va scoate blocarea WRITE. Dacă aceasta este o problemă serioasă pentru aplicația dvs., trebuie să vă gândiți la conversia tabelelor existente în alte tabele care suportă tranzacțiile.

Un fir care așteaptă o blocare de masă poate fi distrus în siguranță prin comanda KILL. Vezi secțiunea 4.5.5, "Sintaxa comenzii KILL".

Rețineți că nu puteți bloca tabelele utilizate împreună cu instrucțiunea INSERT DELAYED. deoarece în acest caz comanda INSERT este executată ca un fir separat.

În mod normal, nu este necesar să blocați mesele, deoarece toate comenzile UPDATE unice sunt indivizibile; Niciun alt fir nu poate interacționa cu orice comandă SQL care se execută în prezent. Cu toate acestea, în unele cazuri este preferabil să blocați mesele într-un fel sau altul:

Dacă intenționați să efectuați un număr mare de operații pe un grup de mese interconectate, atunci cea mai rapidă metodă de a face acest lucru este prin blocarea tabelelor pe care le veți folosi. Desigur, aceasta are partea inversă, deoarece nici un alt flux de control nu poate actualiza tabelul cu blocarea READ sau poate citi tabela de blocare WRITE. Atunci când blocați operațiile LOCK TABLES sunt mai rapide, deoarece, în acest caz, MySQL nu scrie pe disc cache-cheie pentru tabelele blocate pana la comanda DEBLOCARE TABELE se numește (de obicei, memoria cache cheie este spălată după fiecare SQL-comandă). Folosind TABLURI LOCK crește viteza de scriere / actualizare / ștergere în tabele ca MyISAM.

Dacă utilizați tabele care nu acceptă tranzacții, atunci când utilizați programul de procesare a tabelului, trebuie să utilizați comanda LOCK TABLES pentru a vă asigura că nu există nicio altă legătură între operațiunile SELECT și UPDATE. Următorul exemplu arată modul de utilizare a TABELELOR LOCK pentru a efectua cu succes operațiuni:

Fără utilizarea TABELELOR LOCK, este posibil ca orice alt fir de control să poată introduce un nou rând în tabela de transfer între efectuarea operațiilor SELECT și UPDATE.

Utilizarea actualizărilor pas cu pas (valoarea clientului UPDATE SET value = value + new_value) sau LAST_INSERT_ID (). Folosirea comenzii LABEL TABLES în multe cazuri poate fi evitată.

Unele probleme pot fi de asemenea rezolvate prin aplicarea funcțiilor de blocare la nivelul utilizatorului GET_LOCK () și RELEASE_LOCK (). Aceste blocuri sunt stocate într-o tabelă hash pe server și, pentru a furniza viteză mare, sunt implementate ca pthread_mutex_lock () și pthread_mutex_unlock (). Vezi secțiunea 6.3.6.2, "Diverse funcții".

Pentru mai multe informații despre mecanismul de blocare, consultați secțiunea 5.3.1, "Cum MySQL blochează tabelele".

Puteți bloca toate tabelele în toate bazele de date blocând READ cu comanda FLASH TABLES WITH READ LOCK. Vezi secțiunea 4.5.3, "Sintaxă pentru comanda FLUSH". Acest lucru este foarte util pentru obținerea unei copii de rezervă a unui sistem de fișiere precum Veritas, care poate necesita copii în avans ale memoriei când lucrați.

Notă: Comanda LOCK TABLES nu salvează tranzacțiile și captează automat toate tranzacțiile active înainte de a încerca să blocheze tabelele.







Articole similare

Trimiteți-le prietenilor: