Jaký je účinek takového umístění odevzdání do programu?
Dokumentace Oracle popisuje COMMIT
jako:
Účel
Použijte
COMMIT
výpis pro ukončení vaší aktuální transakce a provedení všech změn provedených v transakci. Transakce je sekvence příkazů SQL, se kterou Oracle Database zachází jako s jednou jednotkou. Tento příkaz také vymaže všechny body uložení v transakci a uvolní zámky transakce.
Pokud máte tři PROCEDURE
a každý obsahuje COMMIT
příkaz pak nemůžete spustit všechny tři, pokud se výjimka objeví v druhém z nich, ROLLBACK
všechny, protože změny z prvních dvou již budou COMMIT
ted.
Obecně platí, že byste neměli použijte COMMIT
v PROCEDURE
nebo FUNCTION
ale měli byste nechat na volajícím, aby COMMIT
transakce, aby mohli spojit více akcí dohromady.
Samozřejmě existují případy použití, kdy budete chtít toto pravidlo porušit, ale měli byste zvážit každý případ zvlášť a věnovat čas úplnému pochopení své obchodní logiky, než toto pravidlo porušíte, abyste věděli, co je COMMIT
v každém případě.
Mám tuto transakci provést jako
AUTONOMOUS_TRANSACTION
? ?
Jedním z případů použití je protokolování – můžete mít PROCEDURE
který volá další PROCEDURE
zaznamenat akce uživatele a bez ohledu na to, zda byla počáteční akce úspěšná nebo neúspěšná, chcete o akci uchovat protokol a zajistit, aby byl protokol COMMIT
ted. V tomto případě protokolování PROCEDURE
by měla být AUTONOMOUS_TRANSACTION
a obsahovat COMMIT
a volací příkaz by (pravděpodobně) neměl mít ani jedno ani druhé.
Pokud tedy COMMIT
z jednoho PROCEDURE
je vždy vyžadováno a je nezávislé na tom, zda volající COMMIT
s dalšími údaji pak proveďte PROCEDURE
AUTONOMOUS_TRANSACTION
. Pokud PROCEDURE
s lze sloučit dohromady a poté ROLLBACK
jako skupinu pak nechcete, aby byly AUTONOMOUS_TRANSACTION
s.