Transacciones è i so meccanismi di cuntrollu

Transazzioni

Una transazzione hè una sequenza di operazioni nantu à e dati chì hà un principiu è una fine.

Una transazzione hè l'esekzione sequenziale di operazioni di lettura è scrittura. A fine di una transazzione pò esse o salvà i cambiamenti (commit) o ​​annullà i cambiamenti (rollback). In relazione à una basa di dati, una transazzione hè custituita da parechje dumande chì sò trattate cum'è una sola dumanda.

E transacciones anu da suddisfà e proprietà ACID

Atomicità. A transazzione hè o cumpleta cumplettamente o micca in tuttu.

Cuerenza. Quandu si compie una transazzione, e restrizioni imposte à e dati (per esempiu, limitazioni in a basa di dati) ùn deve esse micca violate. A cunsistenza implica chì u sistema serà trasferitu da un statu currettu à un altru statu currettu.

Isulamentu. E transacciones chì currenu in parallelu ùn devenu micca influenzà l'altri, per esempiu, cambià e dati utilizati da una altra transazzione. U risultatu di eseguisce transazzione parallela deve esse u stessu cum'è se e transazzione sò state eseguite sequentially.

A sustenibilità. Una volta impegnati, i cambiamenti ùn deve esse persu.

Logu di transazzione

U logu conserva i cambiamenti fatti da e transazzione, assicura l'atomicità è a stabilità di e dati in casu di fallimentu di u sistema.

U logu cuntene i valori chì i dati avianu prima è dopu avè cambiatu da a transazzione. A strategia di scrittura in anticipu richiede l'aghjunghje una entrata di logu nantu à i valori precedenti prima di l'iniziu, è nantu à i valori finali dopu chì a transazzione hè finita. In l'eventuali di un arrestu bruscu di u sistema, a basa di dati leghje u log in ordine inversu è annulla i cambiamenti fatti da e transazzione. Dopu avè scontru una transazzione interrotta, a basa di dati eseguisce è face cambiamenti nantu à u logu. Essendu in u statu à u mumentu di u fallimentu, a basa di dati leghje u logu in ordine in avanti è torna i cambiamenti fatti da e transacciones. In questu modu, l'stabilità di e transazzione chì sò digià impegnati è l'atomicità di a transazzione interrotta sò cunservati.

Simply re-executing transacciones falluti ùn hè micca abbastanza per a ricuperazione.

Esempiu. L'utilizatore hà $ 500 in u so contu è l'utilizatore decide di ritirallu da un ATM. Dui transazzioni sò in corso. U primu leghje u valore di u bilanciu è se ci sò abbastanza fondi nantu à u bilanciu, emette soldi à l'utilizatore. U sicondu sottrae a quantità necessaria da u saldu. Diciamu chì u sistema hè cascatu è a prima operazione hà fiascatu, ma a seconda hà fattu. In questu casu, ùn pudemu micca rimette soldi à l'utilizatori senza rinvià u sistema à u so statu originale cù un equilibriu pusitivu.

Livelli d'insulazione

Leghjite Cumpagnia

U prublema Dirty Read hè chì una transazzione pò leghje u risultatu intermediu di una altra transazzione.

Esempiu. U valore di u saldu iniziale hè $ 0. T1 aghjunghje $ 50 à u vostru equilibriu. T2 leghje u valore di u saldu ($ 50). T1 scarta i cambiamenti è esce. T2 cuntinueghja l'esekzione cù dati di equilibriu sbagliati.

A suluzione hè di leghje dati fissi (Read Committed), chì pruibisce a lettura di dati cambiati da a transazzione. Se a transazzione A hà cambiatu un certu settore di dati, a transazzione B, quandu accede à queste dati, hè furzata à aspittà chì a transazzione A sia cumpletata.

Lettura ripetibile

Prublemu di l'aghjurnamenti persi. T1 salva i cambiamenti sopra à i cambiamenti di T2.

Esempiu. U valore di u bilanciu iniziale hè $ 0 è duie transazzioni simultaneamente rinfriscà u saldu. T1 è T2 leghje un saldo di $ 0. T2 dopu aghjunghje $ 200 à $ 0 è salva u risultatu. T1 aghjunghje $ 100 à $ 0 è salva u risultatu. U risultatu finali hè $ 100 invece di $ 300.

Problema di lettura irrepetibile. A lettura di i stessi dati torna ripetutamente valori diffirenti.

Esempiu. T1 leghje un valore di equilibriu di $ 0. T2 dopu aghjunghje $ 50 à u equilibriu è finisce. T1 leghje dinò i dati è trova una discrepanza cù u risultatu precedente.

Lettura ripetibile assicura chì una seconda lettura restituverà u listessu risultatu. I dati letti da una transazzione ùn ponu esse cambiati in altri finu à chì a transazzione hè cumpleta. Se a transazzione A hà lettu un certu inseme di dati, a transazzione B, quandu accede à queste dati, hè furzata à aspittà chì a transazzione A finisci.

Lettura urdinata (serializabile)

Prublemu di Phantom Reads. Dui dumande chì selezziunate e dati basati nantu à una certa cundizione tornanu valori diffirenti.

Esempiu. T1 dumanda u numeru di tutti l'utilizatori chì u saldo hè più grande di $ 0 ma menu di $ 100. T2 deduce $ 1 da un utilizatore cù un saldo di $ 101. T1 reimmette a dumanda.

Lettura urdinata (Serializable). E transazzione sò eseguite cum'è completamente sequenziale. Hè pruibitu di aghjurnà o aghjunghje registri chì entranu in i termini di a dumanda. Se a transazzione A hà dumandatu dati da a tavula sana, allora a tavola sana hè congelata per altre transazzione finu à chì a transazzione A finisce.

Scheduler

Stabilisce l'ordine in quale l'operazioni deve esse realizatu durante e transazzioni parallele.

Fornisce un livellu specificu di isolamentu. Se u risultatu di l'operazioni ùn dipende micca di u so ordine, allora tali operazioni sò commutative (Permutable). L'operazioni di lettura è l'operazioni nantu à e diverse dati sò commutative. L'operazioni di lettura-scrittura è scrittura-scrittura ùn sò micca commutative. U compitu di u pianificatore hè di intercalà l'operazioni realizate da transazzioni parallele in modu chì u risultatu di l'esekzione hè equivalente à l'esekzione sequenziale di e transazzione.

Meccanismi per cuntrullà i travaglii paralleli (Control di cuncurrenza)

L'ottimistu hè basatu annantu à a rilevazione è a risoluzione di cunflitti, u pessimistu hè basatu annantu à a prevenzione di cunflitti.

In l'approcciu ottimista, parechji utilizatori anu copie di e dati à a so dispusizione. A prima persona chì compie a editazione salva i cambiamenti, mentre chì l'altri devenu unisce i cambiamenti. Un algoritmu ottimista permette à u cunflittu per esse, ma u sistema deve ricuperà da u cunflittu.

Cù un accostu pessimista, u primu utilizatore per catturà i dati impedisce à l'altri di riceve i dati. Se i cunflitti sò rari, hè sàviu di sceglie a strategia ottimistica, postu chì furnisce un livellu più altu di cuncurrenza.

Locking

Se una transazzione hà chjusu dati, altre transazzione deve aspittà finu à chì hè sbloccata quandu accede à e dati.

Un bloccu pò esse sovrapposto à una basa di dati, tavula, fila o attributu. Shared Lock pò esse impostu nantu à a listessa data da parechje transazzione, permette à tutte e transazzione (cumpresu quellu chì l'hà impostu) di leghje, pruibisce a mudificazione è a cattura esclusiva. Lock Exclusive pò esse impostu da una sola transazzione, permette ogni azzione di a transazzione imponente, pruibisce ogni azzione da altri.

Un bloccu hè una situazione induve e transazzione finiscinu in un statu pendente chì dura indefinitu.

Esempiu. A prima transazzione aspetta chì i dati catturati da u sicondu per esse liberati, mentre chì a seconda aspetta chì e dati catturati da u primu sia liberatu.

Una suluzione ottimista à u prublema di l'impassu permette chì l'impassu si faci, ma poi ricuperà u sistema rinviendu una di e transazzione implicate in u bloccu.

I deadlocks sò cercati à certi intervalli. Unu di i metudi di deteczione hè da u tempu, vale à dì, cunzidira chì un bloccu hè accadutu se a transazzione dura troppu longu per compie. Quandu si trova un bloccu, una di e transazzione hè ritruvata, chì permette à l'altri transazzioni implicati in u bloccu di cumpletà. L'scelta di a vittima pò esse basatu annantu à u valore di e transazzione o a so anzianità (schemi Wait-Die è Wound-wait).

Ogni transazzione T un timestamp hè assignatu TS chì cuntene l'ora di principiu di a transazzione.

Aspetta-Mori.

se TS (Ti) < TS (Tj), allura Ti aspetta, altrimenti Ti torna in daretu è principia di novu cù u listessu timestamp.

Se una transazzione ghjovana hà acquistatu una risorsa è una transazzione più vechja dumanda a listessa risorsa, allura a transazzione più vechja hè permessa di aspittà. Se una transazzione più vechja hà acquistatu una risorsa, allora a transazzione più ghjovana chì dumanda quella risorsa serà ritruvata.

Ferita-aspetta.

se TS (Ti) < TS (Tj), allura Tj torna in daretu è principia di novu cù u listessu timestamp, altrimenti Ti aspittendu.

Se una transazzione più ghjovana hà acquistatu una risorsa è una transazzione più vechja dumanda a listessa risorsa, allora a transazzione più ghjovana serà ritruvata. Se una transazzione più vechja hà acquistatu una risorsa, allora a transazzione più ghjovana chì dumanda quella risorsa hè permessa di aspittà. A selezzione di vittime basata nantu à a precedenza impedisce i blocchi, ma ripiglia e transazzioni chì ùn sò micca bloccati. U prublema hè chì e transazzione ponu esse ritruvate parechje volte perchè ... una transazzione più vechja pò mantene a risorsa per un bellu pezzu.

Una suluzione pessimista à u prublema di bloccu ùn permette micca chì una transazzione cumencia à eseguisce s'ellu ci hè risicu di un bloccu.

Per detectà un bloccu, un gràficu hè custruitu (attesa gràficu, wait-for-graph), i vertici di quale sò transazzione, è i bordi sò diretti da e transazzione chì aspettanu a liberazione di dati à a transazzione chì hà catturatu sta dati. Un bloccu hè cunsideratu chì hè accadutu se u graficu hà un ciclu. Custruì un gràficu d'attesa, in particulare in basa di dati distribuiti, hè un prucessu caru.

Bloccu in duie fasi - impedisce l'imblocchi pigliendu tutte e risorse aduprate da una transazzione à l'iniziu di a transazzione è liberendu à a fine

Tutte l'operazioni di bloccu devenu precedenu u primu sbloccare. Hà duie fasi - Fase di crescita, durante a quale i grippi s'accumulanu, è a fase di Shrinking, durante a quale i grips sò liberati. S'ellu hè impussibile di catturà una di e risorse, a transazzione principia. Hè pussibule chì una transazzione ùn serà micca capaci di acquistà i risorse necessarii, per esempiu, se parechje transazzioni cumpetenu per i stessi risorse.

Un commit in dui fasi assicura chì l'impegnu hè eseguitu nantu à tutte e repliche di basa di dati

Ogni basa di dati inserisce infurmazioni nantu à e dati chì saranu cambiati in u logu è risponde à u coordinatore OK (Voting Phase). Dopu chì tutti anu rispostu OK, u coordinatore manda un signalu chì obliga à tutti à impegnà. Dopu à l'impegnu, i servitori rispundenu bè se almenu unu ùn risponde micca bè, allora u coordinatore manda un signalu per annullà i cambiamenti à tutti i servitori (Fase di Cumplimentu).

Metudu timestamp

Una transazzione più vechja hè ritruvata quandu pruvate d'accede à e dati implicati da una transazzione più ghjovana

Ogni transazzione hè assignatu un timestamp TS currisponde à l'ora di iniziu di l'esekzione. Se Ti più vechje Tj, allura TS (Ti) < TS (Tj).

Quandu una transazzione hè rinviata, hè assignatu un novu timestamp. Ogni ughjettu di dati Q implicatu in a transazzione hè marcatu cù duie etichette. W-TS (Q) - timestamp di a transazzione più ghjovana chì hà finitu cù successu un record Q. R-TS(Q) - timestamp di a transazzione più nova chì hà realizatu un registru di lettura Q.

Quandu a transazzione T dumanda à leghje i dati Q Ci sò dui ozzione.

se TS (T) < W-TS (Q), vale à dì, a dati hè stata aghjurnata da una transazzione più ghjovana, dopu a transazzione T torna in daretu.

se TS (T) >= W-TS (Q), tandu a lettura hè realizata è R-TS(Q) hè diventatu MAX(R-TS(Q), TS(T)).

Quandu a transazzione T dumanda cambiamenti di dati Q Ci sò dui ozzione.

se TS (T) < R-TS(Q), vale à dì, a dati hè digià statu lettu da una transazzione più ghjovana è se un cambiamentu hè fattu, un cunflittu nascerà. Transazzione T torna in daretu.

se TS (T) < W-TS (Q), vale à dì, a transazzione prova di rimpiazzà un valore più novu, a transazzione T hè retrocessa. In altri casi, u cambiamentu hè realizatu è W-TS (Q) diventa uguale TS (T).

Nisuna custruzzione di gràficu d'attesa caru hè necessaria. E transazzione più vechje dependenu di i più novi, cusì ùn ci sò micca ciculi in u graficu d'aspittà. Ùn ci sò micca blocchi perchè e transazzione ùn sò micca attese, ma rinviate immediatamente. I rollbacks in cascata sò pussibuli. Se Ti s'hè alluntanatu, è Tj Aghju lettu i dati chì aghju cambiatu Ti, allura Tj duverebbe ancu ritruvà. Sè à u listessu tempu Tj hè digià statu impegnatu, allora ci sarà una violazione di u principiu di stabilità.

Una di e soluzioni à i rollback in cascata. Una transazzione compie tutte l'operazioni di scrittura à a fine, è altre transazzione deve aspittà chì l'operazione finisci. E transacciones aspettanu per esse impegnate prima di esse leghjite.

Thomas scrive regula - una variazione di u metudu timestamp in quale i dati aghjurnati da una transazzione più ghjovana hè pruibita da esse sovrascritti da un vechju.

Transazzione T dumanda cambiamenti di dati Q... Sì TS (T) < W-TS (Q), vale à dì, a transazzione prova di scrivite un valore più novu, a transazzione T ùn hè micca ritruvata cum'è in u metudu timestamp.

Source: www.habr.com

Add a comment