SQL Transakce COMMIT ROLLBACK – předcházejte průšvihům

Jako transakci označujeme v SQL logickou množinu nebo sekvence operací, která je do této transakce patří. SQL Transakce můžeme použít pokud nad databázemi provádíme nějaké změny. Všechny prováděné změny jsou poté do této transakce zahrnuty. Můžeme je rozdělit na systémové a uživatelské transakce.

Výhodou používání transakcí je to, že provedené změny jsou odvolatelné a transakci musíme vždy potvrdit přes příkaz COMMIT nebo odvolat přes příkaz ROLLBACK.

Proč je používání transakce výhodné?

Vezměte si situaci, kdy provádíte několik UPDATE a INSERT operací za sebou. Během průběhu operací se může vyskytnout chyba nebo máte chybu ve skriptu. Pokud jste nepoužili transakci (např. v kombinaci s TRY/CATCH) budete v některých případech složitě dohledávat které části skriptu byly provedeny a které ne. Můžete se dostat do takových problémů, že budete potřebovat zálohu db.

Všechny operace, kde provádíme nějakou změnu v databázi mohou být součástí transakcí:

  • DML operace (data manipulation language) – INSERT, UPDATE, DELETE
  • DDL operace (data definition language) – např. CREATE TABLE, CREATE INDEX, atp.

Pokud definujeme sql transakci a v rámci ní provedeme nějakou DML operaci, dochází k uzamčení objektu nad kterým DML provádíme – row lock, page lock, table lock

Transakce je definována v rámci sql relace, pokud je relace otevřena, tak je transakce (a locky) stále aktivní

Syntaxe uživatelské SQL transakce

BEGIN TRANSACTION --definice transakce

   --DDL nebo DML operace

END TRANSACTION;
COMMIT; --potvrzení transakce
ROLLBACK; --odvolání transakce

Transakce mohou být vnořené takže můžete vytvořit transakci v transakci (nested transaction).

Funkce @@TRANCOUNT a XACT_STATE()

Tyto funkce slouží pro zjištění existence, stavu a počtu vnoření transakcí.

A) @@TRANCOUNT – Pomocí této systémové funkce zjistíme počet transakcí v rámci relace

  • 0 znamená, že neexistuje aktivní transakce
  • >0 znamená, že existuje aktivní transakce
  • >1 existuje aktivní vnořená transakce

Syntaxe TRANCOUNT:

SELECT @@TRANCOUNT

B) XACT_STATE() tato funkce je podobná, ale dává jiné informace

  • 0 neexistuje aktivní transakce
  • 1 existuje nepotvrzená transakce, která může být potvrzena (počet vnořených transakcí se nezjišťuje)
  • -1 existuje nepotvrzená transakce, která nemůže být potvrzena z důvodu chyby

Syntaxe XACT_STATE():

SELECT XACT_STATE()

Savepoints v transakci

Záchranné body jsou užitečná funkce. Umožňují v rámci transakce nadefinovat místa, ke kterým se můžete použitím ROLLBACK vrátit. Nemusíte tak odvolávat celou transakci, ale vrátit se zpět pouze o pár kroků.

Syntaxe vytvoření sql SAVEPOINT:

BEGIN TRANSACTION --definice transakce

   --DDL nebo DML operace 1

  SAVE TRANSACTION <název záchranného bodu 1>

   --DDL nebo DML operace 2

  SAVE TRANSACTION <název záchranného bodu 2>

END TRANSACTION;
COMMIT; --potvrzení transakce
ROLLBACK <název záchranného bodu 1>; --vrátí se k savepoint 1

 

Reagovat na příspěvek