sql >> Databáze >  >> RDS >> Oracle

Jaký je účinek umístění odevzdání po DML v proceduře?

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.



  1. Jak přidat AM/PM k časové hodnotě na SQL Server (T-SQL)

  2. Známky toho, že vaše databáze již pro vás nefunguje

  3. Vrácení čísla týdne ISO z data v SQL Server (T-SQL)

  4. SQL Server:DELETE vs TRUNCATE