602SQL-Úplná dokumentace Index  

Chyby a transakce

Transakce spojují provádění operací s databází do atomických celků. Výskyt většiny chyb zasahuje do transakcí, může například předčasně ukončit transakci nebo způsobit odvolání transakce (rollback).

Dojde-li na SQL serveru k chybě nebo výjimce vyvolávající rollback transakce, pak další činnost může jít některou z těchto cest:

  1. pokud chyba či výjimka patří do kategorie "NOT FOUND" nebo "handlable exception condition" a je zpracována handlerem, pak transakce nejsou nijak ovlivněny (typ handleru ovšem určuje, zda některé příkazy nebudou přeskočeny nebo nebude odvolán atomický blok);
  2. pokud chyba je typu "rollback exception condition" a je zpracována handlerem, pak transakce je odvolána ještě před spuštěním handleru; po provedení handleru se pokračuje v místě určeném typem handleru;
  3. pokud chyba či výjimka nepatří do kategorie zpracovatelné handlerem nebo není pro ní handler nalezen, pak se provádění SQL příkazů ukončí a probíhající transakce bude odvolána. Ukončení transakce závisí na způsobu práce klienta:

Informace o transakcích a jejich ovlivnění chybami poskytují funkce Transaction_open a Rolled_back.

Detaily zpracování výjimky pomocí EXIT handleru

Pokud je vyvolána výjimka typu "rollback exception condition", odvolají se změny od začátku transakce, ale provedou se příkazy za koncem bloku, v němž je deklarován EXIT handler pro tuto výjimku. Pokud toto chování není žádoucí, lze EXIT handler přesunout do vnějšího bloku nebo provést v něm příkaz RESIGNAL.

Zpracování výjimek osvětluje příklad:

Níže uvedená procedura Handling demonstruje zpracování výjimky pomocí EXIT handleru. Parametr handlable určuje, zda je vyvolá "handlable exception condition" (true) nebo "rollback exception condition" (false). Parametr resignal_it určuje, zda handler provede příkaz RESIGNAL. Pokud parametr resignal_it má hodnotu true, pak procedura vrátí chybu, protože žádný další handler pro tyto chybu není deklarován.

Pro vyvolání "handlable exception condition" použijeme uživatelskou výjimku ABC. Pro vyvolání "rollback exception condition" použijeme tabulku s unikátním klíčem, do níž se procedura pokusí vložit hodnoty vyvolávající duplicitu klíčů. Tabulka je definovaná takto:

CREATE TABLE RESTAB (VAL INTEGER, CONSTRAINT INDEX1 UNIQUE (VAL) NULL )

Tabulka bude zároveň obsahovat výsledek práce procedury. Procedura je:

PROCEDURE Handling(IN handlable Boolean, IN resignal_it Boolean);
BEGIN
  declare abc condition;
  delete from restab;
  insert into restab values(0);
  commit;
  BEGIN
    declare exit handler for sqlexception, abc
    BEGIN
      update restab set val=val+100;
      commit;
      IF resignal_it THEN resignal;  END IF;
    END;

   // make an update and commit it:
    update restab set val=val+1;   // sets [val] to 1
    commit;
   // make an uncommitted update:
    update restab set val=val+10;  // sets [val] to 11
   // raise the exception:
    IF handlable THEN
      signal abc; // raises the user-defined handlable excetion
    ELSE
      insert into restab values(11); // raises the "key duplicity" rollback-type exception
    END IF;
    update restab set val=val+1000; // not done because the block had been exited
  END;
  update restab set val=val+10000;  // done unless the exception is resignalled
END

Provedení procedury Handling má tento výsledek:

Parametr handlable Parametr resignal_it Výsledek val Návratový kód procedury
false false 10101 OK
false true 101 Duplicita klíčů 40004
true false 10111 OK
true true 111 Uživatelská výjimka ABC není ošetřena 45000