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