• 2.5.2017
  • Ing. Jan Zedníček - Data Engineer & Controlling
  • 0

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í.

@@TRANCOUNT – počet aktivních transakcí v SQL

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

XACT_STATE() – test jestli existuje otevření transakce

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

5/5 - (2 votes)

Ing. Jan Zedníček - Data Engineer & Controlling

Jmenuji se Honza Zedníček a působím jako freelancer. Pracoval jsem dříve také jako BI developer, finanční controller a analytik. Vše pro společnosti z oblasti IT, bankovnictví, consultingu a výroby. Po práci si rád zahraju tenis, volejbal, šachy, zajdu do posilovny a občas neúspěšně odpálím pár balónků v golfu 🏌️

Již cca 10 let zapisuji na tento web různé návody určené zejména odborné veřejnosti, studentům a zájemcům o informace z oblastí Business intelligence, korporátních financí a reportingu.

🔥 Přihlašte se do naší Excel facebook skupiny (2.4k+ členů), kde si pomáháme Excel CZ/SK diskuse »

Leave a Reply

Your email address will not be published. Required fields are marked *