Bod uložení (SQL)

Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od verze recenzované 28. ledna 2022; kontroly vyžadují 3 úpravy .

Savepoint (od bodu uložení - anglicky  save point ) je příkaz SQL , který rozděluje transakci na logické body uložení. Je to také způsob, jak implementovat dílčí transakce (nazývané vnořené transakce) v systému správy relačních databází zadáním bodu v rámci transakce, který lze „vrátit zpět“, aniž by to ovlivnilo jakoukoli práci vykonanou v transakci před vytvořením bodu uložení. V rámci jedné transakce může být více bodů uložení. Body uložení jsou užitečné pro implementaci komplexní obnovy chyb v databázových aplikacích. Pokud dojde k chybě během transakce s více operacemi, aplikace se může z chyby zotavit (návratem do bodu uložení), aniž by musela přerušit celou transakci. Podporované platformy:

Syntaxe SQL

Ukládací bod lze deklarovat následovně (pomocí příkazu SAVEPOINT ).

Název úložného bodu SAVEPOINT

V aktuální transakci je nastaven bod uložení s názvem 'název_bodu_uložení'. Někteří prodejci umožňují v transakci použít body uložení se stejným názvem, ale standard ANSI to nedoporučuje.

Všechny změny provedené po deklaraci bodu uložení lze vrátit zpět zadáním příkazu:

NÁVRAT NA savepoint_name _

Chcete-li odstranit jeden nebo více bodů uložení, použijte příkaz:

Název bodu uložení RELEASE SAVEPOINT

Je důležité poznamenat, že všechny body uložení, které byly vytvořeny po zadaném bodu, budou také odstraněny.

Jak body uložení [

Záchranný bod (dále jen TS) je datová struktura umístěná v dynamické paměti serveru (v transakčním fondu) s jedinečným číselným identifikátorem. Každé vozidlo má seznam akcí provedených v jeho kontextu (tzv. undo log nebo undo log). V rámci transakce tvoří TS zásobník, a proto je jejich vrácení vždy možné pouze postupně. Fragmenty protokolu zpět jsou distribuovány mezi TO, které postupně ukládají historii všech změn provedených v kontextu transakce.

Bod uložení, který je aktivní v době změny záznamu, se nazývá aktuální bod uložení. Informace o změně zápisu se zapisuje do storno deníku aktuálního vozidla. V případě zahájení rollbacku do TS se undo log rozvine v opačném směru a rekonstruuje záznam do podoby, ve které existoval v době instalace tohoto TS. Po rekonstrukci všech upravených záznamů je TS obvykle odstraněn z kontextu transakce. Pokud v kontextu aktuálního TS nejsou žádné obslužné programy výjimek, lze tento proces opakovat, čímž se zruší změny ve vyšším TS. Kromě provozu zpětného vracení do TS probíhá i provoz pravidelného odvozu (vypouštění) TS. Pokud je vozidlo smazáno, jeho protokol vrácení se sloučí s protokolem vrácení předchozího v zásobníku vozidla. S ohledem na výše uvedené lze hovořit o vnoření TS.

Tipy a poznámky k použití

Body uložení se nastavují v rámci transakce, ve které jsou definovány. Názvy bodů uložení musí být v rámci těchto limitů jedinečné. Příkazy BEGIN a COMMIT používejte opatrně, protože pokud omylem zadáte příkaz BEGIN příliš brzy nebo příkaz COMMIT příliš pozdě, může to výrazně ovlivnit způsob zápisu transakcí do databáze. Ujistěte se, že jste zvolili smysluplná jména pro své body uložení, jak se na ně budete odvolávat později ve svých programech. Opětovné použití názvu bodu uložení nebude mít za následek chybu ani varování. Duplikování názvu způsobí, že předchozí bod uložení se stejným názvem bude nefunkční. Buďte opatrní při výběru jmen pro body uložení! Když je transakce spuštěna, jsou utraceny prostředky (jmenovitě zámky), které zajišťují integritu transakcí. Vaše transakce musí být dokončena co nejdříve, aby se zámky uvolnily a ostatní uživatelé mohli využívat zdroje.

Příklad

Chcete-li se po provedení některých úprav vrátit zpět k bodu uložení, zadejte následující příkazy:

INSERT INTO sales VALUES ( 7896 ', ' JR3435 ', ' 28. října 1997 ', 25, ' Net 60 ', ' BU7832 '); SAVEPOINT after_insert; UPDATE sales SET terms=' Net 90 ' WHERE sales_id=' 7896 ' ; SAVEPOINT po_aktualizaci ; DELETE prodej ; ROLLBACK TO after_insert ;

Jak vidíme, je to příkaz ROLLBACK , který se vrátí zpět k bodu uložení s názvem 'after_insert'.

Také příklad, že můžeme vytvořit více bodů uložení (v příkladu jsou nastaveny dva body uložení, ke kterým se můžeme vrátit pomocí příkazu ROLLBACK ):

AKTUALIZACE zaměstnanců SET plat = 7000 WHERE last_name = 'Banda' ; SAVEPOINT banda_sal ; AKTUALIZACE zaměstnanců SET plat = 12000 WHERE last_name = 'Zelená' ; SAVEPOINT greene_sal ; SELECT SUM ( plat ) OD zaměstnanců ; NÁVRAT NA SAVEPOINT banda_sal ; AKTUALIZACE zaměstnanců SET plat = 11000 WHERE last_name = 'Zelená' ; COMMIT ;

Příklad smazání návratového bodu (příklad jasně ukazuje činnost příkazu RELEASE SAVEPOINT ):

INSERT autory ( au_id , au_lname , au_fname , smlouva ) VALUES ( '111-11-1111' , 'Králík' , 'Jessica' , 1 ); SAVEPOINT prvni_bod ulozeni ; INSERT autory ( au_id , au_lname , au_fname , smlouva ) VALUES ( '277-27-2777' , 'Fudd' , 'EP' , 1 ); SAVEPOINT druhý_uložený bod ; INSERT autory ( au_id , au_lname , au_fname , smlouva ) VALUES ( '366-36-3636' , 'Kachna' , 'PJ' , 1 ); SAVEPOINT třetí_bod uložení ; RELEASE SAVEPOINT second_savepoint ; COMMIT ;

V tomto příkladu, když je vymazán bod uložení second_savepoint, systém ve skutečnosti odstraní second_savepoint a third_savepoint, protože třetí_savepoint byl vytvořen po second_savepoint. Po odstranění bodu uložení lze jeho název znovu použít.

Vlastnosti příkazu SAVEPOINT

UNIKÁTNÍ

Určuje, že aplikace nemůže znovu použít název bodu uložení v jednotce obnovy. Pokud v bloku obnovy již existuje bod uložení se stejným názvem jako jeho název, dojde k chybě. Vynechání UNIQUE znamená, že aplikace může znovu použít název bodu uložení v rámci jednotky obnovy. Pokud název-svpt identifikuje bod uložení, který již v jednotce obnovy existuje, a bod uložení nebyl vytvořen pomocí volby UNIQUE, bude stávající bod uložení zničen a bude vytvořen nový bod uložení. Zničení bodu uložení za účelem opětovného použití jeho názvu není totéž jako uvolnění bodu uložení. Opětovné použití názvu bodu uložení zničí pouze jeden bod uložení. Bod uložení můžete uvolnit pomocí příkazu RELEASE SAVEPOINT, který uvolní bod uložení i všechny body uložení, které byly následně nastaveny.

PŘI NÁVRATNÉM ZPŮSKU ZADRŽTE KURZORY

Určuje, že žádné kurzory, které se otevřou po uložení bodu uložení, nebudou sledovány, a tedy nebudou uzavřeny při vrácení zpět do bodu uložení. Přestože tyto kurzory zůstanou otevřené po vrácení zpět do bodu uložení, nemusí být použity. Pokud například vrácení zpět k bodu uložení způsobí, že se vrátí zpět vložení řádku, na který je umístěn kurzor, pak použití kurzoru k aktualizaci nebo odstranění řádku vede k chybě.

NA ZÁMKY VRÁCENÍ ZADRŽTE

Určuje, že žádné zámky, které byly získány od uložení bodu uložení, nejsou sledovány, a proto nejsou zahozeny, když je bod uložení vrácen zpět. ON ROLLBACK RETAIN LOCKS je výchozí chování.

Literatura

Odkazy

  • [1] , Databáze SQL Reference, Oracle
  • [2] , DB2 SQL, IBM