Transakce a zamykání Administrace MS SQL Serveru (NDBI039) Pavel Hryzlík
Základní pojmy Databázová transakce je skupina příkazů, které převedou databázi z jednoho konzistentního stavu do druhého. Transakční log zaznamenávání změn typicky v paměti, u větších transakcí se ukládá na disk ACID Atomicity DT je nedělitelná, změny provede/neprovede jako celek Consistency Databáze stále zůstává v konzistentním stavu Isolation Operace v transakci jsou skryty před vnějšími transakcemi Durability Změny úspěšné DT jsou uloženy v databázi a nemůžou být odvolány
Operace (Transact-SQL) BEGIN DISTRIBUTED TRANSACTION Začátek distribuované transakce spravované MS DTC (Microsoft Distributred Transaction Coordinator) BEGIN TRANSACTION Začátek transakce COMMIT TRANSACTION Potvrzení transakce COMMIT WORK Ořezané potvrzení transakce, nelze definovat rozšířené property (např. název) kompatibilní s SQL92 ROLLBACK TRANSACTION RollBack explicitní/implicitní transakce ROLLBACK WORK Rollback transakce, nelze definovat rozšířené property SAVE TRANSACTION Přidání Savepointu Příkaz - @@TRANCOUNT Čítač zanoření transakcí (BEGIN +1, COMMIT -1, ROLLBACK :=0)
Typy transakcí Explicitní transakce Operace obaleny BEGIN/COMMIT/ROLLBACK Vnořování (@@TRANCOUNT) Stored procedures (Autocommit) Implicitní transakce Každý příkaz v transakci, není třeba BEGIN/COMMIT/ROLLBACK Použije již založenou transakci, pokud existuje, jinak založí novou Příkaz - SET IMPLICIT_TRANSACTIONS ON/OFF
Zámky Účelem zámků je paralelizace, různé granularity, zamykat se dají tabulky, řádky tabulek, celá databáze Zámky automaticky přiřazuje MSSQL Příkaz seznam aktuálně držených zámků - SELECT * FROM sys.dm_tran_locks Shared (S) Zamknutí pro zápis, držitel může pouze číst (SELECT) Update (U) Zámek pro update, kombinace Shared a Exclusive locku Exclusive (X) R/W operace provádí pouze držitel zámku (INSERT/DELETE) Schema speciální zámek při data definition language (DDL) operacích jako přidávání sloupečku, nebo mazání tabulky Key-Range - zamyká rozsah řádků v tabulce Intent Hierarchie zámků, zamykající zdroje na nižších úrovních Intent Shared (IS) Intent Exclusive (IX) Shared with intent exclusive (SIX) Intent update (IU) Shared intent update (SIU) Update intent exclusive (UIX)
Transaction isolation level Izolace transakcí mezi sebou Definování použitých zámků Doba držení zámků pro čtení Čtení modifikovaných dat jinou transakcí Blokace do uvolnění explicitních zámků (RU, Seializable) Čtení pouze potvrzená data (RC, Snapshot) Čtení i nepotvrzených dat (RR) Příkaz SET TRANSACTION ISOLATION LEVEL Isolation level Dirty read Nonrepeatable read Phantom Read uncommitted Yes Yes Yes Read committed No Yes Yes Repeatable read No No Yes Snapshot No No No Serializable No No No
Isolation level explicitních/implicitních transakcí Explicitní transakce Možnost nastavení isolation levelu pro každou transakcí (default SERIALIZABLE) Implicitní transakce Nenastavuje se, použije se nastavení podle předchozí (default READ COMMITED)
Locking hints Specializované zamykání u operací DELETE, INSERT, SELECT, UPDATE, MERGE Příkaz - [Statement] WITH [LOCKING_HINT] SQL server sám optimalizuje exekuční plán pro dotazy, takže se doporučuje spíše pro zkušené adminy Přehled hintů http://technet.microsoft.com/en-us/library/ms187373(v=sql.105).aspx Hint NOWAIT DB se snaží vrátit výsledek okamžitě po obdržení zámku k dané entitě. V případně neúspěchu vrátí chybu. Ekvivalentní s příkazem - SET LOCK_TIMEOUT 0
Ostatní Deadlock Transakce čekají navzájem na zdroje, které jsou již blokovány -> závislost do kruhu Řešení Typicky implementované rozpoznání deadlocku na serveru. MSSQL najde deadlock a zavolá ROLLBACK na jednu z zablokovaných transakcí