350 likes | 484 Views
Transakce. Lubom ír Andrle lubomir.andrle @ unicorn.eu 8 . přednáška 25 .1 1 .201 3. Obsah. Transakce obecně Deadlocky Zamykání v Oracle Flashback query. Transakce. Definice transakce. Množina operací s daty, které splňují podmínku ACID Atomicity Consistency Isolation Durability
E N D
Transakce Lubomír Andrle lubomir.andrle@unicorn.eu 8. přednáška 25.11.2013
Obsah • Transakce obecně • Deadlocky • Zamykání v Oracle • Flashbackquery
Definicetransakce • Množina operací s daty, které splňují podmínku ACID • Atomicity • Consistency • Isolation • Durability • Transakce je logická část, která obsahuje jeden nebo více příkazů SQL • Je atomickou jednotkou
Atomicity • Změna musí být provedena celá (nebo vůbec) • I v případě chyby hardware, chyby software, chyby aplikace, chyby operačního systému • Uživatel musí být informován, zda se transakce uskutečnila a je ukončena • Buď je provedena celá transakce, nebo žádná z databázových operací, které ji tvoří
Consistency • Po konci transakce musí být všechny požadavky na konzistenci databáze splněny • Nullvalues • Foreignkey • Uniqueconstraint • Konzistencetransakceznamená, žeizolovanátransakcezachovávákonzistencidatabáze
Isolation • Neukončené změny nejsou viditelné pro ostatní uživatele • Uživatel provádějící změnu vidí i vlastní nekomitovanézměny • Ipři souběžném běhu transakcí RDBMS zajistí • Pro každou dvojici souběžných transakcí T1 a T2 se T1 jeví, že T2 skončila dříve, než T1 zahájila provádění nebo T2 zahájila provádění až poté, co T1 skončila
Durability • Komitovaná data jsou trvale uložena v databázi • Komitovanáznamená, že uživatel dostal informaci o ukončení komitu • Příkaz commit byl ukončen a server předal řízení uživateli • Transakce přežije jakoukoliv systémovou chybu • Trvalost transakce znamená, že poté, co transakce úspěšně skončí, budou mít všechny změny v databázi, které transakce provedla, trvalý charakter a to i při výpadku systému
Transakce- Commit • Potvrzení transakce znamená, že změny provedené transakcí se stávají trvalými • Explicitní potvrzení – příkazem COMMIT • Implicitní potvrzení – po normálním ukončení nějaké aplikace nebo provedením DDL operace • Jakékoli příkazy DDL způsobí tedy ukončení aktivní transakce a implicitní vytvoření nové transakce • Změny provedené příkazy obsaženými v transakci jsou viditelné pro ostatní uživatele až od okamžiku potvrzení transakce
Transakce - vytvoření • Transakce je inicializována implicitně • Pokud je po dokončení transakce příkazem COMMIT následně vložen, aktualizován či odstraněn alespoň jeden řádek, je tím implicitně vytvořena nová transakce • Po zahájení transakce jí je přiřazen dostupný undotablespace, kam se ukládají změny pro možnost provedení rollbacku • Undoinformace obsahují staré hodnoty dat, které byly SQL příkazem v rámci transakce změněny • Má své číslo Tx ID
Statement-LevelRollback • Pokud během provádění SQL příkazu nastane nějaká chyba • Všechny změny provedené příkazem jsou odrolovány • Toto se nazývá Statement-LevelRollback • Příklady takových chyb • Pokus o vložení řádku s duplicitní hodnotou primárního klíče • Narušení referenční integrity • Deadlock (pokus o současnou změnu shodných dat dvěma transakcemi)
Statement-LevelRollback II • Syntaktická chyba při parsingu neumožní spustit provádění příkazu, proto se nejedná o Statement-LevelRollback • Chyba při provádění příkazu nezpůsobí změny provedené předchozími příkazy v rámci dané transakce
Příkazy pro řízení transakcí • COMMIT • Potvrzení transakce, zafixování stavu • ROLLBACK • Odvolání celé transakce, návrat do původního/zafixovaného stavu • Odvolat transakci je možné pouze uživatelem, který operaci provedl a jen do okamžiku jejich potvrzení příkazem COMMIT
Autonomní transakce • Změna v datech mimo transakci • Například zápis do logu • Nejedná se o paralelní transakci • Autonomní transakce je k dispozici pouze jedna • Sériový přístup k transakčnímu zpracování • Pouze stejná db session
Savepoint • Každé napojení do databáze – maximálně jedna transakce • Savepoint, rollback to savepoint • V transakci se dají zrušit poslední provedené změny • Nejdou zrušit pouze změny ze začátku transakce
Deadlock • Dvě transakce si navzájem blokují zdroje a čekají na jejich uvolnění • Situace může nastat v kterémkoliv systému, kde se více uživatelů dělí o zdroje • Řešení musí provést nějaká vnější autorita • Server dokáže deadlock identifikovat • Server zruší jednu z transakcí
Deadlock II • select * from publisher where pub_id = '1389' for update; • update publisher set name = 'New Age Books' where pub_id = '0736'; • ORA-00060 • select * from publisher where pub_id = '0736' for update; • update publisher set name = 'AldataInfosystems' where pub_id = '1389';
Předcházení deadlockům • Krátké transakce • Vždy přistupovat na zdroje ve stejném pořadí • Co nejnižší granularita zamykání
Implementace pomocí snapshotů • Transakce T1 vidí data ve stavu počátku transakce • Start Timestamp • Pokud data někdo mění, udržuje server pro transakci původní obraz • Na serveru může existovat najednou mnoho obrazů stejných dat • Transakce může měnit data • Při příkazu commit se vytvoří committimestamp • Zkontroluje se, že žádná jiná transakce T2 s committimestamp v intervalu [start timestamp, committimestamp] transakce T1 neměnila data, která chce T2 zapsat. • Pokud ano, je transakce T1 zrušena.
Izolační úrovně – Isolationlevel • Microsoft • SET TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SNAPSHOT | SERIALIZABLE } • Oracle • ReadCommitted (Default) • Konzistence na úrovni příkazu • SerializableTransactions • konzistence na úrovni transakce • Read-only SET TRANSACTION ISOLATION LEVEL READ COMMITTED; SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; SET TRANSACTION ISOLATION LEVEL READ ONLY;
Speciální konstrukce • Nečekat na uvolnění zámku nebo čekat maximálně určenou dobu • select * fromauthorfor update nowait; • select * fromauthorfor update wait 10; • Číst jenom z neuzamčených oblastí • select * fromauthorskip locked; • Manuálně uzamknout tabulku • lock table table_name in {share | exclusive } mode[ wait [ numsecs ] | nowait ]
Základy undotablespace • Návratové tabulkové prostory (undo) zajišťují vrácení změn provedených transakcemi • Kromě toho zajišťují další funkce, například • Zajištění konzistence dat s ohledem na čtení • Provádění operací souvisejících s obnovou dat databáze • Undoretention • ORA-01555 SnapshotTooOld
Data v undo • Data v undomohou být ve 3 stavech • Aktivní (platná, unexpired) • Vyžadována pro zachování konzistence pro čtení nebo pro dokončení transakce, případně nevypršela doba platnosti návratových dat • Neplatná (expired) • Po dokončení všech dotazů, které vyžadovaly platná návratová data a pokud bylo dosaženo doby platnosti návratových dat (Pro podporu technologie Flashback) • Nepoužitá • Veškeré volné místo v návratovém tabulkovém prostoru
Konzistentní čtení • Příklad pro čtení dat z tabulky • Příkaz SELECT je spuštěn v okamžiku SCN (systemchangenumber) = 10023 • Pokud se při čtení narazí na bloky dat změněné po tomto „čase“ (SCN je vyšší), budou pro výsledek dotazu vstupní data rekonstruována s využitím informací uložených v návratovém segmentu • Tím je zajištěna konzistence vstupních dat pro zpracování dotazu a tím platnost výsledku • SCN se při každé transakci zvyšuje o 1
Konzistentní čtení – SQL dotaz • Oracle vždy zajišťuje konzistenci pro čtení na úrovni dotazu • Potvrzení jiné transakce příkazem COMMIT během zpracování dotazu neovlivní jeho výsledek • Vždy je důležitý stav při zahájení dotazu • Konzistence je zajištěna automaticky bez účasti uživatele • Vztahuje se i na vnořené dotazy • Toto ovšem také znamená, že daný dotaz nevidí změny vyvolané jím samotným, ale vždy pracuje s daty ve stavu při jeho spuštění! • Problém by mohl nastat, pokud by příkaz SELECT spouštěl funkci, která by opět obsahovali jiný SELECT (ta by ovšem měla jiné SCN začátku) a uvažovala by již změněná data
Módy zamykání a typy zámků • Oracle používá 2 módy zamykání • Exkluzivní • Uzamčený zdroj nemůže být sdílen • Sdílený • Zamčený zdroj může být sdílen, což umožňuje zejména více přístupů pro čtení, ale zabraňuje konkurenčním zápisům • Kategorie zámků • DML zámky • Např. uzamykání celých tabulek či vybraných řádků • DDL zámky • Chrání např. strukturu tabulek či pohledů • Interní zámky • Chrání interní databázové struktury, jako například datové soubory (latch, mutex) • Uzamykání a odemykání probíhá automaticky dle požadavků transakcí
Auto zamykání • Slouží pro řešení sdíleného (konkurenčního) přístupu více klientů k datům v tabulkách • K nepotvrzeným změnám, které provedl jeden uživatel ostatní uživatelé nemají přístup • Databázový systém zajišťuje konzistentní pohled na data v každém okamžiku • Ostatní uživatelé kromě autora změn vidí data ve stavu před provedením změn až do okamžiku potvrzení
SCN • SystemChangeNumber • Neustále se zvyšující číslo, které jednoznačně identifikuje potvrzenou verzi databáze • Po každém příkazu COMMIT se zvýší SCN • Oracle používá SCN v řídících souborech, návratových souborech, apod. • Zjištění SCN • selectdbms_flashback.get_system_change_numberfromdual;
Flashback • Technologie Flashback využívá data z návratového prostoru • FlashbackQuery • Umožní zobrazit obsah tabulky k danému systémovému bodu změny SCN nebo danému časovému okamžiku v minulosti • Podpora procedur z balíčku DBMS_Flashback • Rozhraní pro provádění operací typu Flashback
Flashbackquery • Od verze Oracle 9i2 je součástí dotazů • Klíčové slovo AS OF • SELECT * FROM T1 AS OF TIMESTAMP TO_TIMESTAMP('2012-11-26 13', 'YYYY-MM-DD HH')WHERE name = ‘Andrle'; • Pozor flashbackquery dělá vždy Hard parse!
Flashback table • Neplést s flashbackquery • Využívá flashback logy, ne undo • Používá se pro účely zálohování • Možnost obnovit řádky tabulky k určitému datu • FLASHBACK TABLE <table_name> TO SCN <scnnumber>; • FLASHBACK TABLE test TO SCN 1833265; • FLASHBACK TABLE <table_name> TO TIMESTAMP <timestamp>; • ALTER TABLE employee ENABLE ROW MOVEMENT; • FLASHBACK TABLE employee TO TIMESTAMP TO_TIMESTAMP('2003-04-04 09:30:00', 'YYYY-MM-DD HH:MI:SS')