sql >> Database >  >> RDS >> Oracle

Geneste transacties gebruiken in Oracle

Oracle ondersteunt geen geneste transacties. Als een transactie zich commit, wordt deze vastgelegd. Daarom wil je over het algemeen geen transactie vastleggen (of terugdraaien) in een opgeslagen procedure, wat het moeilijk maakt om de procedure ergens anders opnieuw te gebruiken als je transactiesemantiek verschilt.

U kunt echter aan het begin van uw procedure een savepoint declareren en in het geval van een fout teruggaan naar dat savepoint. Als u vervolgens de vastlegging verwijdert, wordt de transactie uitsluitend gecontroleerd door de applicatiecode en niet door de databasecode

begin
  savepoint beginning_of_proc;

  insert/update/delete...

exception 
  when OTHERS then 
    rollback to beginning_of_proc;
    raise;
end;

In dit geval zou mijn voorkeur echter zijn om geen savepoint in de code te hebben, geen rollback te hebben en de uitzondering niet te vangen, tenzij je er iets nuttigs mee doet. Voer gewoon de DML uit, laat eventuele uitzonderingen optreden en behandel ze in uw toepassing.



  1. Een gegevensmodel voor de bezorging van boodschappen

  2. Hoe lees je alle rijen van een enorme tafel?

  3. gebruik mysql SUM() in een WHERE-component

  4. FOUT:Fout 1005:Kan tabel niet maken (fout:121)