{"id":30878,"date":"2019-10-31T21:37:56","date_gmt":"2019-10-31T18:37:56","guid":{"rendered":"https:\/\/prohoster.info\/blog\/tranzaktsii-i-mehanizmy-ih-kontrolya\/"},"modified":"2019-10-31T21:37:56","modified_gmt":"2019-10-31T18:37:56","slug":"tranzaktsii-i-mehanizmy-ih-kontrolya","status":"publish","type":"post","link":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/tranzaktsii-i-mehanizmy-ih-kontrolya","title":{"rendered":"Tranzac\u021bii \u0219i mecanismele lor de control","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<h2>Tranzac\u021bii<\/h2>\n<p><\/p>\n<h4>O tranzac\u021bie este o secven\u021b\u0103 de opera\u021bii asupra datelor care are un \u00eenceput \u0219i un sf\u00e2r\u0219it.<\/h4>\n<p>\nO tranzac\u021bie este o execu\u021bie secven\u021bial\u0103 a opera\u021biunilor de citire \u0219i scriere. Sf\u00e2r\u0219itul unei tranzac\u021bii poate fi fie salvarea modific\u0103rilor (commit), fie anularea modific\u0103rilor (rollback). \u00cen cazul bazelor de date, o tranzac\u021bie const\u0103 din mai multe cereri, care sunt interpretate ca o singur\u0103 cerere.<\/p>\n<h4>Tranzac\u021biile trebuie s\u0103 respecte propriet\u0103\u021bile ACID.<\/h4>\n<p>\nAtomicitate. O tranzac\u021bie fie se execut\u0103 complet, fie nu se execut\u0103 deloc.<\/p>\n<p>Consisten\u021b\u0103. La finalizarea unei tranzac\u021bii, constr\u00e2ngerile impuse asupra datelor (de exemplu, constraints \u00een bazele de date) nu trebuie s\u0103 fie \u00eenc\u0103lcate. Consisten\u021ba implic\u0103 faptul c\u0103 sistemul va fi transformat dintr-o stare corect\u0103 \u00eentr-o alt\u0103 stare corect\u0103.<\/p>\n<p>Izolare. Tranzac\u021biile care ruleaz\u0103 \u00een paralel nu trebuie s\u0103 influen\u021beze una asupra celeilalte, de exemplu, s\u0103 schimbe datele utilizate de o alt\u0103 tranzac\u021bie. Rezultatul execu\u021biei tranzac\u021biilor paralele trebuie s\u0103 fie acela ca \u0219i cum tranzac\u021biile s-ar fi executat secven\u021bial.<\/p>\n<p>Persisten\u021b\u0103. Dup\u0103 commit, modific\u0103rile nu trebuie pierdute.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Jurnalul tranzac\u021biilor.<\/h2>\n<p><\/p>\n<h4>Jurnalul stocheaz\u0103 modific\u0103rile efectuate de tranzac\u021bii, asigur\u00e2nd atomicitatea \u0219i persisten\u021ba datelor \u00een caz de e\u0219ec al sistemului.<\/h4>\n<p>\nJurnalul con\u021bine valorile pe care datele le aveau \u00eenainte \u0219i dup\u0103 modificarea acestora de c\u0103tre tranzac\u021bie. Strategia Write-ahead log oblig\u0103 ad\u0103ugarea \u00een jurnal a \u00eenregistr\u0103rilor pentru valorile anterioare \u00eenainte de \u00eenceputul tranzac\u021biei, iar pentru cele finale dup\u0103 finalizarea acesteia. \u00cen caz de oprire brusc\u0103 a sistemului, baza de date cite\u0219te jurnalul \u00een ordine invers\u0103 \u0219i anuleaz\u0103 modific\u0103rile efectuate de tranzac\u021bii. La \u00eent\u00e2lnirea unei tranzac\u021bii \u00eentrerupte, baza de date o finalizeaz\u0103 \u0219i \u00eenregistreaz\u0103 modific\u0103rile \u00een jurnal. Fiind \u00een starea de la momentul e\u0219ecului, baza de date cite\u0219te jurnalul \u00een ordine direct\u0103 \u0219i returneaz\u0103 modific\u0103rile efectuate de tranzac\u021bii. Astfel, se p\u0103streaz\u0103 persisten\u021ba tranzac\u021biilor care au fost deja confirmate \u0219i atomicitatea tranzac\u021biei \u00eentrerupte.<\/p>\n<p>O simpl\u0103 reluare a tranzac\u021biilor eronate nu este suficient\u0103 pentru recuperare. <\/p>\n<p><i>Exemplu. Utilizatorul are un sold de 500$ \u0219i decide s\u0103 \u00eei retrag\u0103 prin ATM. Se efectueaz\u0103 dou\u0103 tranzac\u021bii. Prima cite\u0219te valoarea soldului \u0219i, dac\u0103 soldul este suficient, elibereaz\u0103 banii utilizatorului. A doua scade suma necesar\u0103 din sold. S\u0103 presupunem c\u0103 a avut loc o defec\u021biune a sistemului \u0219i prima opera\u021biune nu s-a finalizat, dar a doua a fost efectuat\u0103. \u00cen acest caz, nu putem elibera din nou banii utilizatorului f\u0103r\u0103 a readuce sistemul la starea ini\u021bial\u0103 cu un sold pozitiv.<\/i><\/p>\n<h2>Niveluri de izolare<\/h2>\n<p><\/p>\n<h4>Citirea datelor fixe (Read Committed)<\/h4>\n<p>\nProblema citirii murdare (Dirty Read) const\u0103 \u00een faptul c\u0103 o tranzac\u021bie poate citi un rezultat intermediar al unei alte tranzac\u021bii.<\/p>\n<p><i>Exemplu. Valoarea ini\u021bial\u0103 a soldului este 0$. T1 adaug\u0103 50$ la sold. T2 cite\u0219te valoarea soldului (50$). T1 anuleaz\u0103 modific\u0103rile \u0219i se finalizeaz\u0103. T2 continu\u0103 executarea av\u00e2nd date eronate despre sold.<\/i><\/p>\n<p>Solu\u021bia const\u0103 \u00een citirea datelor fixe (Read Committed) care interzice citirea datelor modificate de o tranzac\u021bie. Dac\u0103 tranzac\u021bia A a modificat un set de date, atunci tranzac\u021bia B, c\u00e2nd solicit\u0103 aceste date, este obligat\u0103 s\u0103 a\u0219tepte finalizarea tranzac\u021biei A.<\/p>\n<h4>Citirea repetabil\u0103 (Repeatable Read)<\/h4>\n<p>\nProblema actualiz\u0103rilor pierdute (Lost Updates). T1 salveaz\u0103 modific\u0103rile deasupra modific\u0103rilor T2.<\/p>\n<p><i>Exemplu. Valoarea ini\u021bial\u0103 a soldului este 0$ \u0219i dou\u0103 tranzac\u021bii umple simultan soldul. T1 \u0219i T2 citesc un sold egal cu 0$. Apoi T2 adaug\u0103 200$ la 0$ \u0219i salveaz\u0103 rezultatul. T1 adaug\u0103 100$ la 0$ \u0219i salveaz\u0103 rezultatul. Rezultatul final este 100$ \u00een loc de 300$.<\/i><\/p>\n<p>Problema citirii nerepetabile (Unrepeatable read). Citirea repetat\u0103 a acelora\u0219i date returneaz\u0103 valori diferite.<\/p>\n<p><i>Exemplu. T1 cite\u0219te valoarea soldului egal\u0103 cu 0$. Apoi T2 adaug\u0103 50$ la sold \u0219i se finalizeaz\u0103. T1 cite\u0219te din nou datele \u0219i descoper\u0103 o discrepan\u021b\u0103 fa\u021b\u0103 de rezultatul anterior.<\/i><\/p>\n<p>Citirea repetabil\u0103 (Repeatable Read) garanteaz\u0103 c\u0103 citirea repetat\u0103 va returna acela\u0219i rezultat. Datele citite de o tranzac\u021bie nu pot fi modificate de altele p\u00e2n\u0103 la finalizarea tranzac\u021biei. Dac\u0103 tranzac\u021bia A a citit un anumit set de date, tranzac\u021bia B, c\u00e2nd solicit\u0103 aceste date, este obligat\u0103 s\u0103 a\u0219tepte finalizarea tranzac\u021biei A.<\/p>\n<h4>Citirea ordonat\u0103 (Serializable)<\/h4>\n<p>\nProblema citirii fantom\u0103 (Phantom Reads). Dou\u0103 interog\u0103ri care selecteaz\u0103 date pe o anumit\u0103 condi\u021bie returneaz\u0103 valori diferite.<\/p>\n<p><i>Exemplu. T1 solicit\u0103 num\u0103rul tuturor utilizatorilor ale c\u0103ror solduri sunt mai mari de 0$ dar mai mici de 100$. T2 scade 1$ de la utilizatorul cu un sold de 101$. T1 efectueaz\u0103 din nou interogarea.<\/i><\/p>\n<p>Citire ordonat\u0103 (Serializable). Tranzac\u021biile sunt executate ca fiind complet secven\u021biale. Este interzis\u0103 actualizarea sau ad\u0103ugarea de \u00eenregistr\u0103ri care se \u00eencadreaz\u0103 \u00een condi\u021biile interog\u0103rii. Dac\u0103 tranzac\u021bia A a solicitat datele \u00eentregii tabele, tabela este complet blocat\u0103 pentru celelalte tranzac\u021bii p\u00e2n\u0103 la finalizarea tranzac\u021biei A.<\/p>\n<h2>Programator (Scheduler)<\/h2>\n<p><\/p>\n<h4>Stabile\u0219te ordinea \u00een care trebuie s\u0103 fie efectuate opera\u021biile \u00een cazul tranzac\u021biilor care se desf\u0103\u0219oar\u0103 \u00een paralel.<\/h4>\n<p>\nAsigur\u0103 un nivel specific de izolare. Dac\u0103 rezultatul execu\u021biei opera\u021biunilor nu depinde de ordinea acestora, atunci astfel de opera\u021bii sunt comutabile (Permutable). Opera\u021biile de citire \u0219i opera\u021biile pe date diferite sunt comutabile. Opera\u021biile de citire-scriere \u0219i cele de scriere-scriere nu sunt comutabile. Sarcina programatorului este de a alterna opera\u021biile efectuate de tranzac\u021biile paralele astfel \u00eenc\u00e2t rezultatul final s\u0103 fie echivalent cu execu\u021bia secven\u021bial\u0103 a tranzac\u021biilor.<\/p>\n<h2>Mecanisme de control al sarcinilor paralele (Concurrency Control)<\/h2>\n<p><\/p>\n<h4>Optimistul se bazeaz\u0103 pe detectarea \u0219i rezolvarea conflictelor, pesimistul pe prevenirea apari\u021biei conflictelor.<\/h4>\n<p>\n\u00cen abordarea optimist\u0103, mai mul\u021bi utilizatori primesc \u00een gestionare copii ale datelor. Primul care finalizeaz\u0103 editarea salveaz\u0103 modific\u0103rile, ceilal\u021bi trebuie s\u0103 realizeze o fuziune a modific\u0103rilor. Algoritmul optimist permite apari\u021bia conflictului, dar sistemul trebuie s\u0103 se recupereze dup\u0103 acesta.<\/p>\n<p>\u00cen abordarea pesimist\u0103, primul utilizator care captureaz\u0103 datele \u00eempiedic\u0103 ob\u021binerea datelor de c\u0103tre ceilal\u021bi. Dac\u0103 conflictele sunt rare, este rezonabil s\u0103 alegi strategia optimist\u0103, deoarece ofer\u0103 un nivel mai \u00eenalt de paralelism.<\/p>\n<h2>Blocarea (Locking)<\/h2>\n<p><\/p>\n<h4>Dac\u0103 o tranzac\u021bie a blocat datele, atunci celelalte tranzac\u021bii care acceseaz\u0103 aceste date trebuie s\u0103 a\u0219tepte deblocarea.<\/h4>\n<p>\nUn bloc poate fi aplicat unei baze de date, unei tabele, unei linii sau unui atribut. Un blocare comun\u0103 (Shared Lock) poate fi aplicat\u0103 asupra unor date de mai multe tranzac\u021bii, permi\u021b\u00e2nd tuturor tranzac\u021biilor (inclusiv celei care a aplicat-o) s\u0103 citeasc\u0103, dar interzic\u00e2nd modificarea \u0219i blocarea exclusiv\u0103. O blocare exclusiv\u0103 (Exclusive Lock) poate fi aplicat\u0103 doar unei singure tranzac\u021bii, permi\u021b\u00e2nd orice ac\u021biuni tranzac\u021biei care a aplicat-o, dar interzic\u00e2nd orice ac\u021biuni celorlalte.<\/p>\n<h4>O blocare de interblocare este o situa\u021bie \u00een care tranzac\u021biile se afl\u0103 \u00eentr-o stare de a\u0219teptare, care dureaz\u0103 la nesf\u00e2r\u0219it.<\/h4>\n<p>\n<i>Exemplu. Prima tranzac\u021bie a\u0219teapt\u0103 eliberarea datelor blocate de a doua, \u00een timp ce a doua a\u0219teapt\u0103 eliberarea datelor blocate de prima.<\/i><\/p>\n<h4>Solu\u021bia optimist\u0103 pentru problema interbloc\u0103rilor permite interblocarea s\u0103 aib\u0103 loc, dar apoi restaureaz\u0103 sistemul, f\u0103c\u00e2nd rollback uneia dintre tranzac\u021biile implicate \u00een interblocare.<\/h4>\n<p>\nCu o anumit\u0103 frecven\u021b\u0103, se realizeaz\u0103 c\u0103utarea interbloc\u0103rilor. Una dintre modalit\u0103\u021bile de detectare este \u00een func\u021bie de timp, adic\u0103 se consider\u0103 c\u0103 a ap\u0103rut o interblocare dac\u0103 o tranzac\u021bie dureaz\u0103 prea mult. Atunci c\u00e2nd se g\u0103se\u0219te o interblocare, una dintre tranzac\u021bii este anulat\u0103, ceea ce ofer\u0103 posibilitatea altor tranzac\u021bii implicate \u00een interblocare s\u0103 finalizeze. Alegerea victimei poate fi bazat\u0103 pe costul tranzac\u021biilor sau pe vechimea acestora (schemele Wait-Die \u0219i Wound-wait). <\/p>\n<p>Fiec\u0103rei tranzac\u021bii <b>T<\/b> \u00eei este atribuit\u0103 un timestamp <b>TS<\/b> care con\u021bine timpul de \u00eenceput al execu\u021biei tranzac\u021biei.<\/p>\n<p>Wait-Die. <\/p>\n<p><u>Dac\u0103 <b>TS(Ti)<\/b> &lt; <b>TS(Tj)<\/b>, atunci <b>Ti<\/b> a\u0219teapt\u0103, altfel <b>Ti<\/b> este anulat\u0103 \u0219i \u00eencepe din nou cu acela\u0219i timestamp.<\/u><\/p>\n<p>Dac\u0103 o tranzac\u021bie t\u00e2n\u0103r\u0103 a blocat o resurs\u0103, iar o tranzac\u021bie mai veche cere aceea\u0219i resurs\u0103, tranzac\u021biei mai vechi i se permite s\u0103 a\u0219tepte. Dac\u0103 tranzac\u021bia mai veche a blocat resursa, tranzac\u021bia t\u00e2n\u0103r\u0103 care solicit\u0103 aceast\u0103 resurs\u0103 va fi anulat\u0103.<\/p>\n<p>Wound-wait. <\/p>\n<p><u>Dac\u0103 <b>TS(Ti)<\/b> &lt; <b>TS(Tj)<\/b>, atunci <b>Tj<\/b> este anulat\u0103 \u0219i \u00eencepe din nou cu acela\u0219i timestamp, altfel <b>Ti<\/b> a\u0219teapt\u0103.<\/u><\/p>\n<p>Dac\u0103 o tranzac\u021bie mai t\u00e2n\u0103r\u0103 a ob\u021binut un resurs, iar o tranzac\u021bie mai veche solicit\u0103 acelea\u0219i resurse, tranzac\u021bia mai t\u00e2n\u0103r\u0103 va fi anulat\u0103. Dac\u0103 o tranzac\u021bie mai veche a ob\u021binut resursul, tranzac\u021biei mai tinere i se permite s\u0103 a\u0219tepte pentru a solicita acel resurs. Alegerea victimei pe baza vechimii previne apari\u021bia blocajelor, dar anuleaz\u0103 tranzac\u021biile care nu sunt blocate reciproc. Problema const\u0103 \u00een faptul c\u0103 tranzac\u021biile pot fi anulate de mai multe ori, deoarece o tranzac\u021bie mai veche poate men\u021bine resursa pentru mult timp.<\/p>\n<h4>O solu\u021bie pesimist\u0103 pentru problema blocajelor nu permite tranzac\u021biei s\u0103 \u00eenceap\u0103 execu\u021bia dac\u0103 exist\u0103 riscul de a cauza un blocaj.<\/h4>\n<p>\nPentru a detecta blocajele se construie\u0219te un grafic (graficul a\u0219tept\u0103rii, wait-for-graph), v\u00e2rfurile c\u0103ruia sunt tranzac\u021bii, iar arcele sunt direc\u021bionate de la tranzac\u021biile care a\u0219teapt\u0103 eliberarea datelor c\u0103tre tranzac\u021bia care a ob\u021binut aceste date. Se consider\u0103 c\u0103 s-a produs un blocaj dac\u0103 graficul este ciclic. Construirea graficului de a\u0219teptare, mai ales \u00een baza de date distribuite, este o procedur\u0103 costisitoare.<\/p>\n<h4>Blocarea \u00een dou\u0103 faze previne blocajele prin ob\u021binerea tuturor resurselor folosite de tranzac\u021bie la \u00eenceputul tranzac\u021biei \u0219i eliberarea lor la final.<\/h4>\n<p>\nToate opera\u021biunile de blocare trebuie s\u0103 precead\u0103 prima opera\u021biune de deblocare. Are dou\u0103 faze \u2014 Faza de Cre\u0219tere \u00een care se acumuleaz\u0103 ob\u021bineri \u0219i Faza de Sc\u0103dere \u00een care se elibereaz\u0103 ob\u021binerile. \u00cen cazul \u00een care nu este posibil s\u0103 se ob\u021bin\u0103 o resurs\u0103, tranzac\u021bia \u00eencepe de la cap\u0103t. Poate exista o situa\u021bie \u00een care tranzac\u021bia nu poate ob\u021bine resursele necesare, de exemplu, dac\u0103 mai multe tranzac\u021bii concureaz\u0103 pentru acelea\u0219i resurse.<\/p>\n<h4>Comiterea \u00een dou\u0103 faze garanteaz\u0103 executarea comiterii pe toate replicile bazei de date.<\/h4>\n<p>\nFiecare baz\u0103 de date \u00eenregistreaz\u0103 informa\u021bii despre datele care vor fi modificate \u00een jurnal \u0219i r\u0103spunde coordonatorului cu OK (Faza de Votare). Dup\u0103 ce toate r\u0103spund cu OK, coordonatorul trimite un semnal care oblig\u0103 pe to\u021bi s\u0103 efectueze comiterea. Dup\u0103 comitere, <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/ro\/server\/dts-los-angeles\/\"   title=\"server\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"3482\">server<\/a> r\u0103spund cu OK; dac\u0103 m\u0103car unul nu a r\u0103spuns cu OK, coordonatorul trimite un semnal care anuleaz\u0103 modific\u0103rile tuturor serverelor (Faza de Completare).<\/p>\n<h2>Metoda etichetelor temporale.<\/h2>\n<p><\/p>\n<h4>O tranzac\u021bie mai veche este anulat\u0103 \u00een momentul \u00een care \u00eencearc\u0103 s\u0103 acceseze datele implicate de o tranzac\u021bie mai t\u00e2n\u0103r\u0103.<\/h4>\n<p>\nFiec\u0103rei tranzac\u021bii i se atribuie un marcaj temporal <b>TS<\/b> corespunz\u0103tor momentului de \u00eenceput al execu\u021biei. Dac\u0103 <b>Ti<\/b> este mai veche <b>Tj<\/b>, atunci <b>TS(Ti)<\/b> &lt; <b>TS(Tj)<\/b>.<\/p>\n<p>C\u00e2nd o tranzac\u021bie este retrogradat\u0103, i se atribuie un nou marcaj temporal. Fiecare obiect de date <b>Q<\/b> implicat \u00een tranzac\u021bie este marcat cu dou\u0103 m\u0103rci. <b>W-TS(Q)<\/b> \u2014 marcajul temporal al celei mai recente tranzac\u021bii care a efectuat cu succes scrierea asupra <b>Q<\/b>. <b>R-TS(Q)<\/b> \u2014 marcajul temporal al celei mai recente tranzac\u021bii care a efectuat scrierea pentru citire asupra <b>Q<\/b>.<\/p>\n<p>C\u00e2nd tranzac\u021bia <b>T<\/b> solicit\u0103 citirea datelor <b>Q<\/b> sunt posibile dou\u0103 op\u021biuni.<\/p>\n<p><u>Dac\u0103 <b>TS(T)<\/b> &lt; <b>W-TS(Q)<\/b>, adic\u0103 datele au fost actualizate de o tranzac\u021bie mai recent\u0103, atunci tranzac\u021bia <b>T<\/b> se retrogradeaz\u0103.<\/u><\/p>\n<p><u>Dac\u0103 <b>TS(T)<\/b> &gt;= <b>W-TS(Q)<\/b>, atunci citirea se efectueaz\u0103 \u0219i <b>R-TS(Q)<\/b> devine <b>MAX(R-TS(Q), TS(T))<\/b>.<\/u><\/p>\n<p>C\u00e2nd tranzac\u021bia <b>T<\/b> solicit\u0103 modificarea datelor <b>Q<\/b> sunt posibile dou\u0103 op\u021biuni. <\/p>\n<p><u>Dac\u0103 <b>TS(T)<\/b> &lt; <b>R-TS(Q)<\/b>, adic\u0103 datele au fost deja citite de o tranzac\u021bie mai recent\u0103 \u0219i dac\u0103 se efectueaz\u0103 modificarea, va ap\u0103rea un conflict. Tranzac\u021bia <b>T<\/b> se retrogradeaz\u0103. <\/u><\/p>\n<p><u>Dac\u0103 <b>TS(T)<\/b> &lt; <b>W-TS(Q)<\/b>, adic\u0103 tranzac\u021bia \u00eencearc\u0103 s\u0103 rescrie o valoare mai nou\u0103, tranzac\u021bia T se retrogradeaz\u0103. \u00cen celelalte cazuri, modificarea se efectueaz\u0103 \u0219i <b>W-TS(Q)<\/b> devine egal cu <b>TS(T)<\/b>.<\/u><\/p>\n<p>Nu este necesar\u0103 construc\u021bia costisitoare a unui grafic de a\u0219teptare. Tranzac\u021biile mai vechi depind de cele mai noi, prin urmare \u00een graficul de a\u0219teptare nu exist\u0103 cicluri. Nu sunt blocaje reciproce, deoarece tranzac\u021biile nu a\u0219teapt\u0103, ci se retrogradeaz\u0103 imediat. Pot ap\u0103rea retrograd\u0103ri \u00een cascad\u0103. Dac\u0103 <b>Ti<\/b> s-a retrogradat, iar <b>Tj<\/b> a citit datele pe care le-a modificat <b>Ti<\/b>, atunci <b>Tj<\/b> de asemenea trebuie s\u0103 se retrogradeze. Dac\u0103 \u00een acest timp <b>Tj<\/b> a fost deja confirmat\u0103, va ap\u0103rea \u00eenc\u0103lcarea principiului de consisten\u021b\u0103.<\/p>\n<p>Una dintre solu\u021biile pentru retrograd\u0103rile \u00een cascad\u0103. Tranzac\u021bia efectueaz\u0103 toate opera\u021biunile de scriere la sf\u00e2r\u0219it, iar celelalte tranzac\u021bii sunt obligate s\u0103 a\u0219tepte finalizarea acestei opera\u021biuni. Tranzac\u021biile a\u0219teapt\u0103 confirmarea \u00eenainte de a citi.<\/p>\n<h4>Regula de scriere Thomas \u2014 o varia\u021bie a metodei marcajelor temporare prin care datele actualizate de o tranzac\u021bie mai recent\u0103 nu pot fi rescrise de o tranzac\u021bie mai veche<\/h4>\n<p>\nTransac\u021bie <b>T<\/b> solicit\u0103 modificarea datelor <b>Q<\/b>. Dac\u0103 <b>TS(T)<\/b> &lt; <b>W-TS(Q)<\/b>, adic\u0103 tranzac\u021bia \u00eencearc\u0103 s\u0103 rescrie o valoare mai nou\u0103, tranzac\u021bia T nu se retrogradeaz\u0103 ca \u00een metoda marcajelor temporare.<br \/>\n<br \/>Sursa: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/446662\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0435\u0439 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043d\u0430\u0434 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u043c\u0435\u044e\u0449\u0430\u044f \u043d\u0430\u0447\u0430\u043b\u043e \u0438 \u043a\u043e\u043d\u0435\u0446 \u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f \u044d\u0442\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0447\u0442\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043f\u0438\u0441\u0438. \u041e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u0435\u043c \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043b\u0438\u0431\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 (\u0444\u0438\u043a\u0441\u0430\u0446\u0438\u044f, commit) \u043b\u0438\u0431\u043e \u043e\u0442\u043c\u0435\u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 (\u043e\u0442\u043a\u0430\u0442, rollback). \u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043a \u0411\u0414 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f \u044d\u0442\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u0440\u0430\u043a\u0442\u0443\u044e\u0442\u0441\u044f \u043a\u0430\u043a \u0435\u0434\u0438\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441. \u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c ACID \u0410\u0442\u043e\u043c\u0430\u0440\u043d\u043e\u0441\u0442\u044c. \u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f \u043b\u0438\u0431\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-30878","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0435\u0439 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043d\u0430\u0434 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u043c\u0435\u044e\u0449\u0430\u044f \u043d\u0430\u0447\u0430\u043b\u043e \u0438 \u043a\u043e\u043d\u0435\u0446 \u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f \u044d\u0442\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0447\u0442\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043f\u0438\u0441\u0438.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/tranzaktsii-i-mehanizmy-ih-kontrolya\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0438 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b \u0438\u0445 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0435\u0439 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043d\u0430\u0434 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u043c\u0435\u044e\u0449\u0430\u044f \u043d\u0430\u0447\u0430\u043b\u043e \u0438 \u043a\u043e\u043d\u0435\u0446 \u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f \u044d\u0442\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0447\u0442\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043f\u0438\u0441\u0438.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/tranzaktsii-i-mehanizmy-ih-kontrolya\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T18:37:56+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:37:56+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Tranzac\u021bii \u0219i mecanismele de control al acestora | ProHoster","description":"Tranzac\u021bii O tranzac\u021bie este o secven\u021b\u0103 de opera\u021biuni asupra datelor care are un \u00eenceput \u0219i un final. O tranzac\u021bie reprezint\u0103 execu\u021bia secven\u021bial\u0103 a opera\u021biunilor de citire \u0219i scriere.","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/tranzaktsii-i-mehanizmy-ih-kontrolya","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"ro_RO","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0438 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b \u0438\u0445 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f | ProHoster","og:description":"\u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0435\u0439 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043d\u0430\u0434 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u043c\u0435\u044e\u0449\u0430\u044f \u043d\u0430\u0447\u0430\u043b\u043e \u0438 \u043a\u043e\u043d\u0435\u0446 \u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f \u044d\u0442\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0447\u0442\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043f\u0438\u0441\u0438.","og:url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/tranzaktsii-i-mehanizmy-ih-kontrolya","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T18:37:56+00:00","article:modified_time":"2019-10-31T18:37:56+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"30878","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-02-22 15:31:13","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 03:27:38","updated":"2026-02-22 15:31:13","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/30878","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=30878"}],"version-history":[{"count":1,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/30878\/revisions"}],"predecessor-version":[{"id":162008,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/30878\/revisions\/162008"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=30878"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=30878"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=30878"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}