602SQL-Úplná dokumentace Index  

Transakce (SQL)

Transakce spojují provádění operací s databází do nedělitelných (atomických) celků. Operace sdružené do transakce mohou být jako celek:

Transakce se používají tam, kde skupina operací v databází spolu úzce souvisí a potřebujeme se vyhnout situaci, že se část z nich provede a část ne. Typickým příkladem je převádění peněz z účtu na účet: je potřeba současně převáděnou částku z jednoho účtu odečíst a na druhý přičíst.

Po zahájení transakce se změny ukládají do interního transakčního logu, který 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. Jedním z důsledků zapnutého jištění transakcí (viz Ochrana transakcemi a jištěním transakcí) je to, že veškerý transakční obsah se ukládá na disk, aby nedošlo ke ztrátě dat při vypnutí serveru (transakce se dokončí při dalším spuštění).

Řízení transakcí při posílání příkazů z klienta

Po připojení se klienta na server se každý příkaz (ovlivňující data) provádí jako samostatná transakce. Pokud proběhne úspěšně, je potvrzen, při chybě je odvolán. Těmto transakcím říkáme implicitní (tento režim se také nazývá autocommit).

Provede-li klient SQL příkaz START TRANSACTION nebo zavolá-li API funkci Start_transaction, otevře tím explicitní transakci, která sdruží provádění následujících příkazů. Tuto transakci pak klient buď potvrdí SQL příkazem COMMIT nebo API funkcí Commit, anebo odvolá SQL příkazem ROLLBACK nebo API funkcí Roll_back. Po potvrzení nebo odvolání transakce se zpracování příkazů vrací do režimu, v němž je každý příkaz prováděn v samostatné transakci, až do případného otevření další explicitní transakce.

Chyba v explicitní transakci

Pokud během provádění příkazů v explicitní transakci dojde k závažné chybě, nastane implicitní rollback. V závislosti na nastavení příznaku kompatibility SQLOPT_ERROR_STOPS_TRANS je buď transakce odvolána ihned anebo trvá až do explicitního ukončení a je odvolána až při něm.

V prvním případě je transakce chybou automaticky odvolána a zpracování příkazů vrací do režimu, v němž je každý příkaz prováděn v samostatné transakci. Klient proto nesmí pokračovat v posílání zbylých příkazů nedokončené původní transakce, protože by se provedly v samostatných transakcích (a tudíž nebudou odvolány).

V druhém případě klient může chybu ignorovat a je zaručeno, že i zbylé příkazy budou odvolány. SQL příkaz COMMIT nebo API funkce Commit provedené po chybě odvolají a ukončí chybnou transakci.

Implicitní rollback způsobí také volání funkce klientského API cd_Break_user a cd_disconnect.

Vynucené ukončení explicitní transakce

Existují některé speciální akce, které vždy provedou potvrzení explicitní transakce (implicitní commit) bez ohledu na původní členění transakce. Jedná se o takové akce, které by nešlo případně odvolat. Patří mezi ně volání funkcí klientského API Delete_all_records, Free_deleted, Backup_database_file, Compact_table, Compact_database, Database_integrity, Move_data, Login, Logout a Set_property_value pro vlastnost SERVER_KEY. Commit se provede také před nebo po provedení SQL příkazů DROP TABLE, ALTER TABLE, CREATE INDEX, DROP INDEX, DROP SCHEMA, ALTER DOMAIN, CREATE SEQUENCE, ALTER SEQUENCE, CREATE FULLTEXT, DROP FULLTEXT, ALTER FULLTEXT, RENAME. Commit se provádí také při volání funkcí pro příjem pošty, které pracují se systémovými tabulkami (MailBoxLoad, MailBoxGetFilInfo, MailBoxGetMsgEx, MailBoxGetMsg, MailBoxSaveFileDBs, MailBoxSaveFileDBr).

Transakce ve vývojovém prostředí

Interaktivní práce s vývojovým klientem zahrnuje v mnoha akcích ukončování transakcí např. při otevření aplikace, používání návrhářů apod. Při běžné práci také dochází ke (skrytým) chybám, které odvolají případnou transakci. I když je možné pomocí SQL konzole otevřít explicitní transakci pro vývojového klienta, nelze to doporučit, protože uživatel nemá kontrolu nad jejím ukončením.

Řízení transakcí v procedurách prováděných na serveru

Spustí-li klient proceduru na serveru, probíhá celá operace v jedné (implicitní) transakci. To platí i o akcích vyvolaných v důsledku provádění příkazů, například o provádění triggerů nebo akcí aktivní referenční integrity.

Pokud má být tato posloupnost akcí rozčleněna do více (implicitních) transakcí, je třeba do ní zařadit příkaz COMMIT. Tím se potvrdí předchozí transakce a automaticky zahájí nová.

Explicitními transakcemi lze přesněji řídit atomicitu akcí. Explicitní transakce může trvat přes hranici procedury. Explicitní transakce nelze používat v triggerech.

Další vlastnosti transakcí

Rollback neumožňuje odvolat přiřazení hodnoty lokální proměnné ani efekt provedených externích rutin (například odeslání dopisu, zápis do logu).

Transakce nelze vnořovat do sebe. Vnoření transakcí vyvolá chybu.

Pro účely ladění může být výhodné trasovat vyvolání implicitních rollbacků z důvodu chyby (situace TRACE_IMPL_ROLLBACK).

Použití transakcí také úzce souvisí se zajištěním databáze proti porušení integrity.

Informace o transakcích a jejich ovlivnění chybami poskytují klientské funkce Transaction_open a Rolled_back. Stav transakce libovolného vlákna lze zjistit pomocí systémového dotazu _iv_logged_users, sloupec Transaction_open.

Body návratu

Kromě transakcí existuje ještě jeden mechanismus dovolující odvolat skupinu provedených příkazů a vrátit se do stavu před jejich provedením. Tímto mechanismem jsou body návratu (savepoints).

Pomocí příkazu SAVEPOINT lze uvnitř transakce vytvořit bod návratu. Po provedení dalších příkazů lze se pak příkazem ROLLBACK TO SAVEPOINT vrátit k tomu stavu databáze, který byl v okamžiku provedení příkazu SAVEPOINT (a neukončit transakci).


Odchylky od Intermediate level směrem k Full level nebo k SQL 3

Seznam subsekcí: