Transakce RNDr. Ondřej Zýka ndrej.zyka@prfinit.eu 2014 Prfinit. All rights reserved.
Obsah Definice Savepint, autnmní transakce Transakční módy Izlační úrvně Implementace pmcí zámků Implementace pmcí snapshtů Oracle, Micrsft SQL server Deadlck 2014 Prfinit. All rights reserved. 2
Transakce Mnžina perací s daty, které splňují pdmínku ACID Atmicity Cnsistency Islatin Durability 2014 Prfinit. All rights reserved. 3
Transakce Atmicity Změna musí být prvedena celá (neb vůbec) I v případě chyby hardware, chyby sftware, chyby aplikace, chyby peračníh systému. Uživatel musí být infrmván, zda se transakce uskutečnila a je uknčena. Cnsistency p knci transakce musí být všechny pžadavky na knzistenci databáze splněny null values freign key unique cnstraint deferred 2014 Prfinit. All rights reserved. 4
Transakce Islatin - Neuknčené změny nejsu viditelné pr statní uživatele. Uživatel prvádějící změnu vidí i vlastní nekmitvané změny. Durability Cmmitvaná data jsu trvale ulžena v databázi. Cmmitvaná znamená, že uživatel dstal infrmaci uknčení cmmitu. (Příkaz cmmit byl uknčen a server předal řízení uživateli). Transakace přežije jakukliv systémvu chybu. 2014 Prfinit. All rights reserved. 5
Transakce v jiných významech Aplikační transakce Vytvření bjednávky (desítky databázvých transakcí), Přepčet hdncení skladu (desítky minut). Transakce na pdnikvé úrvni Schválení půjčky něklik aplikačních transakcí, wrkflw zasahující něklik ddělení. Lng-running transactin transakční mdel pdprující persistenci transakcí při restartu systémů, interakci s uživateli, pravné blky kódu spuštěné při neúspěchu perací. 2014 Prfinit. All rights reserved. 6
Savepint Každé napjení d databáze maximálně jedna transakce. Savepint, rllback t savepint V transakci se dají zrušit pslední prvedené změny Nejdu zrušit puze změny ze začátku transakce Begin tran Rllback t savepint S1 cmmit X:=1 Y:=2 Z:= 3 Savepint S1 2014 Prfinit. All rights reserved. 7
Autnmní transakce Změna v datech mim transakci Například zápis d lgu Oracle Na úrvní prcedury Begin tran rllback X:=1 L:= 1 Z:=1 Autnmní transakce Knec autnmní transakce 2014 Prfinit. All rights reserved. 8
Knzistentní stav databáze Dva lgické přístupy Pkud A dělá změnu, data jsu neknzistentní a B musí pčkat na knzistentní stav. Implementace pmcí zamykání. I když A dělá změnu, existuje knzistentní stav - pslední knzistentní stav před změnu A. Multiversin cncurency cntrl (snapshts) 2014 Prfinit. All rights reserved. 9
Transakční mód Chained Začátek transakce První příkaz (ne každý) Insert, update, delete, select fr update/hldlck, Knec transakce Cmmit, rllback Unchained Každý příkaz autnmní transakce Začátek transakce Explicitně begin tran Knec transakce Cmmit, rllback 2014 Prfinit. All rights reserved. 10
Transakční mód Oracle Chained mde MS SQL server, Sybase Unchained i chained mód Simulace (v klientských nástrjích) Chained módu Cmmit begin tran, rllback begin tran Není ekvivalentní chained módu Unchained módu Cmmit za každým příkazem 2014 Prfinit. All rights reserved. 11
Prušení izlace transakcí Dirty write Tranakce T1 změní data, která jsu měněna v prbíhající transakci T2. Dirty read Transakce T1 načte data změněná transakcí T2 ještě před tím, než transakce T2 prvedla cmmit. Fuzzy read (Nn-repeatable read) Během transakce T1 se dvakrát načte řádek a pkaždé se vrátí jiná hdnta (transakce T2 mdifikvala řádek mezi dvěma čteními). Phantm Během transakce T1 se prvede dvakrát stejný dtaz a pkaždé vrátí jiný výsledek (transakce T2 přidala neb ubrala řádek pužitý v dtazu transakce T1). 2014 Prfinit. All rights reserved. 12
ANSI islatin level Read uncmmited Read cmmited Repeatable read Serializable Dirty write Dirty read Fuzzy read Phantm Nt pssible Nt pssible Nt pssible Nt pssible Pssible Pssible Pssible Nt pssible Pssible Pssible Nt pssible Nt pssible Pssible Nt pssible Nt pssible Nt pssible 2014 Prfinit. All rights reserved. 13
Implementace pmcí zámků Typy zámků Shared transkce čte bjekt, zámek knčí p načtení bjeku neb trvá d knce transakce Exclusive transakce mění bjekt, zámek trvá d knce transakce Update bjekt zřejmě bude změněn (cursr) Zámek na data, zámek na indexy Dba uvlnění zámků Rzsah zámků Řádek Stránka Tabulka Databáze Intend zámek Intend table shared na tabulce existuje shared zámek na nějakém řádků neb stránce 2014 Prfinit. All rights reserved. 14
Kmbinace zámků Micrsft SQL Server 2012 Pžadvané zámky Existující zámky 2014 Prfinit. All rights reserved. 15
Implementace pmcí zámků Prblematické vlastnsti Pkud transakce dluh a čast exklusivně zamykají řádek, nedá se řádek číst. Pkud mnh transakcí dluhdbě zamyká řádek pr čtení, nedá se upravit. Uzamknutí stránky neb tabulky mezí přístup i na data, která transakce nepužívá. Režie s mnžstvím zámků Zámky vyžadují zdrje datvéh serveru Eskalace zamykání Abslutní nutnst pužívat krátké transakce 2014 Prfinit. All rights reserved. 16
Speciální knstrukce Nečekat na uvlnění zámku neb čekat maximálně určenu dbu select * frm authr fr update nwait; select * frm authr fr update wait 10; Číst jenm z neuzamčených blastí select * frm authr readpast; Manuálně uzamknut tabulku lck table table_name in {share exclusive } mde [ wait [ numsecs ] nwait ] 2014 Prfinit. All rights reserved. 17
Optimistické schéma zamykání Ke knfliktům dchází zřídka Načtení hdnt Zpracvání hdnt Při zápisu kntrla, že pužité hdnty jsu správné Pkud ne, prveď pravu Znvu načti data a prveď pakuj výpčet Infrmuj uživatele 2014 Prfinit. All rights reserved. 18
Optimistické schéma zamykání select @ld_clumn=clumn frm table where cnditin (cnditin vybere jeden řádek) Pužití: @ld_clumn Natavení: @new_clumn update table set clumn = @new_clumn where clumn = @ld_clumn and cnditin Update jednh řádku hdnta se nezměnila -> cmmit Update žádnéh řádku hdnta se změnila -> prava 2014 Prfinit. All rights reserved. 19
Pesimistické schéma zamykání Ke knfliktům dchází čast Načtení hdnt a jejich uzamčení Mžné čekání na mžnst uzamčení neb chybvý stav Zpracvání hdnt Cmmit Ostatní čekají neb bdrží chybvu hlášku 2014 Prfinit. All rights reserved. 20
Pesimistické schéma zamykání select @ld_clumn=clumn frm table where cnditin with hldlck (řádek je uzamčen) Pužití: @ld_clumn Natavení: @new_clumn update table set clumn = @new_clumn where cnditin cmmit 2014 Prfinit. All rights reserved. 21
MVCC (PsgreSQL) Každá transakce má rstucí timestamp - XID Verze na úrvni řádků (becně něklik verzí) xmin timestamp vytvření timestamp transakce, která řádek vytvřila xmax timestamp uknčení timestamp transakce, která řádek zrušila update zruší starý a vytvří nvý řádek Transakce s timestampem x vidí řádky Svje změny xmin < x, xmax neexistuje a transakce s xmin je kmitvaná xmin < x, xmax < x a transakce s xmax je nekmitvaná Pdmínky pr změny (pdle izlačních úrvní) viz dkumentace. 2014 Prfinit. All rights reserved. 22
MVCC 2014 Prfinit. All rights reserved. 23
Izlační úrvně Micrsft SET TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED READ COMMITTED REPEATABLE READ SNAPSHOT SERIALIZABLE } [ ; ] 2014 Prfinit. All rights reserved. 24
Izlační úrvně Oracle Read Cmmitted (Default) knzistence na úrvni příkazu Serializable Transactins knzistence na úrvni transakce Read-nly SET TRANSACTION ISOLATION LEVEL READ COMMITTED; SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; SET TRANSACTION ISOLATION LEVEL READ ONLY; Oracle Zámky puze pr měněná data Zámky na úrvni řádků neexistuje/není ptřeba eskalace Transakce libvlně dluhé cmmit zatěžuje server Dluhá Serializable transakce nevidí změny v datech, chyba v serializable módu se bjeví až při příkazu cmmit. 2014 Prfinit. All rights reserved. 25
Deadlck Dvě transakce si navzájem blkují zdrje a čekají na jejich uvlnění. Situace může nastat v kterémkliv systému, kde se více uživatelů dělí zdrje. Řešení musí prvést nějaká vnější autrita datvý server 2014 Prfinit. All rights reserved. 26
Deadlck Server dkáže deadlck identifikvat Server zruší jednu z transakcí Begin tran Y=? X:=10 X=? Y:=50 Begin tran 2014 Prfinit. All rights reserved. 27
Deadlck update publisher set name = 'Aldata Infsystems' where pub_id = '1389'; update publisher set name = 'New Age Bks' where pub_id = '0736'; update publisher set name = 'New Age Bks' where pub_id = '0736'; update publisher set name = 'Aldata Infsystems' where pub_id = '1389'; ORA-00060 2014 Prfinit. All rights reserved. 28
Cffmanvy pdmínky Dvě transakce si navzájem blkují zdrje a čekají na jejich uvlnění. Situace může nastat v kterémkliv systému, kde se více prcesů dělí prstředky. Přesněji: Může nastat v každém systému, kde mhu být splněny tzv. Cffmanvy pdmínky: Mutual Exclusin Prstředek může v jednm kamžiku vlastnit puze jeden prces. Hld and wait Prces může žádat další prstředky, i když má nějaké přiděleny. N preemtin Pkud prces prstředek vlastní, nelze mu h bezpečně dejmut (musí h vrátit sám). Circual wait Je mžné uzavřít cyklus prcesů vzájemně čekajících na zdrje svéh předchůdce. 2014 Prfinit. All rights reserved. 29
Předcházení deadlckům Oslabením některé z Cffmanvých pdmínek Nastavením všech zámků na začátku transakce Zamykání tabulek ve stejném přadí Pužití krátkých transakcí Řešení prvede externí autrita datvý server Zruší zablkvaný prces Přinutí prces aby nějaké zdrje uvlnil 2014 Prfinit. All rights reserved. 30
Nn serializable set transactin islatin level serializable; update publisher set name = 'Aldata Infsystems' where pub_id = '1389'; update publisher set name = 'XXX' where pub_id = '0736'; cmmit; update publisher set name = name '!' where pub_id = '0736'; cmmit; 2014 Prfinit. All rights reserved. 31
Nn serializable update publisher set name = 'Aldata Infsystems' where pub_id = '1389'; update publisher set name = 'XXX' where pub_id = '0736'; cmmit; update publisher set name = name '!' where pub_id = '0736'; cmmit; ORA-08177 2014 Prfinit. All rights reserved. 32
Závěry Slžitst prblematiky se prjeví při zvýšení pčtu uživatelů (paralelních transakcí) nikliv při vývji. Nárůst prblémů je expnenciální s pčtem paralelních transakcí. Nutn pčítat s tím, že transakce bude z nějakéh důvdu zrušena. Je nutné znát přesné mžnsti a chvání knkrétníh serveru (verze) 2014 Prfinit. All rights reserved. 33
C si zapamatvat C t je transakce K čemu služí savepint C t je autnmní transakce Jaké existují transakční módy a v čem se liší Definice islační úrvně pdle ANSI nrmy Jak se implementují islační úrvně pmcí mechanismu zámků Jak se implementují islační úrvně pmcí snapshtů C t je ptimistické a pesimistické schéma zamykání C t je deadlck, jak se dá deadlckům předcházet 2014 Prfinit. All rights reserved. 34
2014 Prfinit. All rights reserved. Diskuse