Transakce a zamykání Jiří Tomeš Administrace MS SQL Serveru (NDBI039)
O čem to dnes bude Úvodní opakování základních pojmů Jištění transakcí Speciální konstrukce Typy transakcí Závěrečný souhrn, použité prameny a zdroje Zámky a Izolace Prostor pro dotazy
Co je transakce : Trocha opakování Skupina (SQL) příkazů (operace s databází) převádějící data mezi jednotlivými konzistentními stavy Navenek se tváří jako 1 příkaz Pro databázový stroj je chápána jako nedělitelná jednotka je potřeba, aby byla celá dokončena (commit) jinak nesmí být vůbec provedena (rollback) Transakce vždy musí splňovat podmínky ACID
A Atomicity ( VŠE nebo NIC ) transakce musí být nedělitelná I Isolation ( Vzájemně se nevidí ) O podmínkách ACID pokud nemůže databázový stroj operaci dokončit, veškeré již provedené změny musí být zrušeny C Consistency ( Data se nesmí poškodit ) data musí být před započetím i po dokončení v konzistentním stavu změny prováděné v 1 transakci nejsou v jiné transakci viditelné D Durability (NE)Dokončené změny transakce se (NE)projeví v databázi
Co se děje uvnitř Po zahájení transakce se změny ukládají do interního transakčního logu Ten je zpočátku v operační paměti a při větších transakcích se odkládá na disk do souboru transact.fil Až do commitu jsou tedy v databázi uložené hodnoty z doby před zahájením transakce Jak docílit toho, aby nedošlo ke ztrátě dat i při vypnutí serveru? Použijeme MECHANISMUS JIŠTĚNÍ!!!
Mechanismus jištění transakcí Při provádění transakcí je kritickým bodem jejich uzavírání (zaznamenávání změn do databáze) Mechanismus jištění přitom zajišťuje: Konzistenci databáze (v případě výpadku počítače během uzavírání transakce) Vypíná či zapíná správce databáze Zapíná se pomocí vlastnosti serveru SecureTransaction
Zápis změn na disk Většina OS má zabudovanou funkci, která odkládá zápis změn na disk (pro zrychlení běhu aplikace) Má-li spolehlivě fungovat jištění transakcí, pak je nezbytné zapisovat při ukončení transakce všechny změny na disk Zapíná se pomocí vlastnosti serveru FlushOnCommit
Ovlivnění rychlosti Jištění transakcí: Vyžaduje cca dvojnásobný počet diskových operací při každé transakci Transakce nemají vliv na: rychlost čtení, vyhledávání Příklad (provedeno 1000 zápisů): Závisí na použitém počítači Pouze pro vyjádření závislosti času na způsobu práce
Typy transakcí SQL server rozlišuje následující typy transakcí: Explicitní chceme-li více operací v datech provést jako 1 celek Implicitní každý příkaz ~ vlastní transakce Autocommit defaultní nastavení
Explicitní transakce Začátek a konec transakce je explicitně zadán pomocí příkazů BEGIN TRANSACTION COMMIT (případně ROLLBACK) Explicitní transakce mohou být vnořené, kdy v těle jedné transakce je vložena další To umožňuje vytvářet uložené procedury pracující s vlastními transakcemi a volat je bez ohledu na to, zda volající proces má či nemá otevřenou transakci
Autocommit & TRANCOUNT V takovém případě je u transakce příkaz vykonán ve vlastní samostatné transakci, která je po dokončení operace automaticky potvrzena. Odtud také název autocommit. Funkce @@TRANCOUNT: (INT) SELECT @@TRANCOUNT; 0 (žádná transakce není otevřená) číslo (úroveň zanoření) BEGIN (+1) COMMIT (-1) ROLLBACK (přiřadí 0)
Implicitní transakce Práce s implicitními transakcemi : SET IMPLICIT_TRANSACTIONS ON; V tomto módu každý příkaz v rámci daného připojení otevře transakci, pokud žádná není otevřená Pokud již transakce otevřená je, příkaz novou transakci neotvírá, ale je vykonán v rámci transakce již otevřené. Ukončení transakce musí být v tomto módu provedeno vždy explicitně voláním příkazu COMMIT, případně ROLLBACK. Transakce se tedy v tomto módu otevírá sama (implicitně), ukončit transakci je však třeba explicitně.
Exklusivní (X) Zámky a izolace transakcí Číst a zapisovat může pouze vlastník zámku Smí být přidělen nejvýše 1 transakci Trvá do konce transakce Sdílené (S) Uzamkne se daná entita pro zápis Číst může vlastník zámku (má jistotu, že nikdo nezapisuje) Může být přidělen více transakcím Trvá do načtení objektu nebo konce transakce SQL Server chce docílil co možná největší míry paralelního zpracování - používá různou granularitu zámků. Lze zamykat Řádky tabulek, celé datové stránky, tabulky, databáze
Případné problémy se zámky Kritické vlastnosti: Pokud transakce dlouho a často zamyká exkluzivně řádek, nedá se číst Pokud mnoho transakcí zamyká řádek pro čtení, nedá se upravit Uzamknutí stránky nebo celé tabulky omezí přístup na data, která transakce nepoužívá Zámky vyžadují určitou režii
Izolace transakcí Úroveň izolace transakcí Transaction Isolation Level udává do jaké míry se budou transakce vzájemně ovlivňovat jak moc si budou vidět pod ruce Použitá úroveň izolace transakcí přitom ovlivňuje: Zda se budou používat zámky a jakých typů Jak dlouho se mají držet zámky pro čtení Zda-li čtení dat modifikovaných jinou transakcí: Bude blokováno, dokud se neuvolní explicitní zámky Použije se potvrzená verze dat Přečtou se modifikovaná dosud nepotvrzená data
Typy úrovně izolace transakcí SQL server rozlišuje 5 typů: READ COMMITED (default) READ UNCOMMITED REPEATABLE READ SERIALIZABLE SNAPSHOT (od verze 2005) Úroveň izolace lze pak nastavit příkazem SET : SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
Jak to celé funguje: Princip snapshotů Transakce T1 vidí data ve stavu počátku transakce (Start Timespan) Pokud data někdo mění, server udržuje pro transakci původní obraz Na serveru může najednou existovat mnoho obrazů stejných dat Transakce může měnit data Po provedení COMMIT se vytvoří COMMIT Timespan Ověří se, že žádná jiná transakce T2 s COMMIT Timespan v intervalu [Start Timespan, COMMIT Timespan] transakce T1 neměnila data, která chce T2 zapsat. Pokud ano, je T2 zrušena
Explicitní vs. Implicitní Izolace Explicitní transakce Stupeň izolace se nastavuje pro každou transakci zvlášť Pomocí START_TRANSACTION Není-li zvolen stupeň izolace, zvolí-li SERIALIZABLE Implicitní transakce Není způsob jak nastavit stupeň izolace Použije se způsob u předchozí prováděné transakce Není-li možné aplikovat předchozí pravidlo, nastaví se READ COMMITED
START_TRANSACTION Schéma příkazu : START_TRANSACTION [izolace][druh_izolace] Izolace ::= IZOLATION LEVEL READ UNCOMITTED READ UNCOMITTED REPEATABLE READ SERIALIZABLE druh_izolace ::= READ ONLY READ WRITE
Přehledová tabulka: Úroveň izolace souhrnem Dirty write: T1 modifikuje A T2 modifikuje A před tím než T1 projede COMMIT (ROLLBACK)??? Stav A při ROLLBACK T1(T2) Dirty read: T1 modifikuje A T2 čte A před koncem T1!!! ROLLBACK T1 => neexistující data pro T2
Fuzzy read & Phantom Fuzzy read: T1 přečte A T2 změní nebo zruší A a projede COMMIT!!! T1 přečte data A, ty ale mají jinou hodnotu (nebo neexistují) Phantom: T1 přečte data s podmínkou <where> T2 přidá data odpovídající <where> a provede COMMIT!!! T1 znovu načte data s touto podmínkou,ale přitom dostane jiný výsledek
Phantom se vrací Kde je (může být) problém? Select může vrátit nenulové číslo jiná transakce mezitím vložila produkt s DPH 22% jiná transakce smazala nějaký zmodifikovaný záznam
Princip deadlocku (uváznutí) : Deadlock Jde o situaci, kdy si 2 transakce (nebo více) vzájemně blokují zdroje a čekají na jejich uvolnění Může nastat prakticky v každém systému, kde se více uživatelů dělí o zdroje Řešení pak musí provést nějaká vnější autoria Datový server Server dokáže deadlock identifikovat Zruší jednu (ev. i více) z množiny transakcí
Speciální konstrukce Nečekat na uvolnění zámků nebo čekat jen nezbytnou dobu select * from employee for update nowait; select * from employee for update wait 10; Číst pouze z neuzamčených oblastí select * from employee for update nowait; Manuálně uzamknout tabulku lock table table_name in {share exclusive } mode [ wait [ numsecs ] nowait ]
Závěrečné shrnutí Složitost problematiky transakcí se projevuje při zvýšení počtu uživatelů (paralelních transakcí) Nárůst problému je exponenciální vzhledem k počtu paralelních transakcí Nutno vždy počítat s tím, že transakce bude z nějakého důvodu zrušena Je vždycky dobré znát vlastnosti a přesné možnosti konkrétního serveru (verze)
Použité zdroje a prameny Microsoft SQL Server 2008 Books Online http://msdn.microsoft.com/enus/library/windows/desktop/aa366402(v=vs.85).aspx Článek z ROOT.CZ http://www.root.cz/clanky/transakce-a-izolace-transakci-vdatabazich/ 602SQL Server http://sql602.sourceforge.net/helpdir- cs/html/he_sql2_transakce.htm
Prostor pro dotazy Zeptejte se na to, co Vás zajímá DÍKY za pozornost během prezentace