Un pic despre impas, savepearlharbor

Este un post scurt despre cauzele Impas

Proiectele mai puțin încărcate care utilizează tranzacția InnoDB, în orice moment poate fi un fel de eroare







«Impas găsit când încercarea de a obține de blocare; încercați să reporniți tranzacția »

Principalul lucru este de a nu intra in panica la vederea acestor cuvinte teribile, acum ne uităm la ce se întâmplă asta.

Un pic despre tipurile de încuietori

Documentația oficială despre tipurile de încuietori Mysql scrise destul de un pic, și anume:

Se spune de asemenea că, dacă Tranzaktsiya№1 deține tipul de blocare S r on-line, celălalt Tranzaktsiya№2 poate captura de blocare. Pentru a obține un tip de blocare X pe această linie, a doua tranzacție va trebui să aștepte în liniște pe margine.

Dacă Tranzaktsiya№1 deține blocarea de tip X în rândul r, atunci Tranzaktsiya№2 nu poate apuca aceeași blocare, sau pentru a obține un nou nivel de S. Este liniște din nou și așteaptă până când linia necesară Tranzaktsiya№1 de presă.

Există un punct important de învățat: Lock S și X - este o blocare 2. Acest lucru nu înseamnă că blocarea S, este un subset al X. bloc Acestea sunt două entități diferite.







Să ne întoarcem la impas. Pe unele forumuri am văzut întrebările „Cum să obțineți un impas în Mysql». Este de fapt foarte simplu.

Toate ingredientele necesare pe care le avem la dispoziție: două tranzacții, tipul de blocare S și X și linia pe care se obține de blocare.

rețetă pentru scurt impas
1) dobândește blocarea Tranaktsiya№1 S și continuă să lucreze
2) Tranaktsiya№2 încercarea de a obține un sistem de blocare de tip X și ... începe să se aștepte atunci când blocarea de presă Tranaktsiya№1 S
3) Tranaktsiya№1 încercarea de a obține un sistem de blocare de tip X și ... începe să se aștepte atunci când Tranaktsiya№2 obține un sistem de blocare de tip X și eliberați-l

E un moment alunecos. S-ar părea că împiedică Tranzaktsii№1 obține o blocare X în cazul în care are deja o blocare S pe aceeași linie. Și previne ce am discutat despre
1) În primul rând X este S și două alt sistem de blocare
2) Al doilea tip de blocare S nu are dreptul de a primi de blocare de tip X. Nu există privilegii - în locul!

Codul pentru situația de mai sus,

Cum a face cu ea? Off. site-ul Mysql sfatuieste Komichi mai des, și, de asemenea, verificați din nou codul de eroare și ReWire rostogolească înapoi tranzacția. Cred că există o opțiune mai bună - doar pentru a obține un X. tip de blocare Apoi, în a treia etapă de prescripție noastre Tranzaktsiya№1 ar putea obține blocarea lor legitimă și pașnică capăt

În cele din urmă, voi spune că cauza blocare, utilizați comanda SHOW ENGINE InnoDB STATUS. care arată care blochează care păstrează și ce așteaptă