2017-02-02 7 views
-1

Ich habe eine Prozedur in einem Paket erstellt, die Einfügen/Löschen in der Tabelle und nach erfolgreicher Transaktion Commit durchgeführt wird.Welchen Effekt hat das Commit nach DML in der Prozedur?

wie folgt aus:

create or replace package pac is  
procedure pr_test(emp_id number) 
is 
begin 
-- some code 
if something then 
    insert 
else 
    delete 

commit; 
end pr_test; 
end pac ; 

Sollte ich diese Transaktion als AUTONOMOUS_TRANSACTION? Was ist der Effekt, das Commit so in das Programm zu setzen?

Antwort

4

Was ist der Effekt, das Commit so in Programm zu setzen?

Die Oracle Documentation beschreibt COMMIT wie:

Zweck

Verwenden Sie die COMMIT Anweisung Ihre aktuelle Transaktion zu beenden und permanent alle Änderungen in der Transaktion durchgeführt werden.Eine Transaktion ist eine Sequenz von SQL-Anweisungen, die Oracle Database als eine einzige Einheit behandelt. Diese Anweisung löscht auch alle Sicherungspunkte in der Transaktion und gibt Transaktionssperren frei.

Wenn Sie drei PROCEDURE haben und jedes enthält eine COMMIT Anweisung, dann können Sie nicht alle drei dann ausführen, wenn eine Ausnahme in einem Letztere auftritt, ROLLBACK sie alle als die Veränderungen von den ersten beiden bereits COMMIT ted wird .

Als allgemeine Regel sollten Sie nicht Verwendung COMMIT in einem PROCEDURE oder FUNCTION aber sollte es dem Anrufer zu COMMIT die Transaktion verlassen, so dass sie zusammen mehrere Aktionen bündeln können.

Es gibt natürlich Anwendungsfälle, in denen Sie diese Regel verletzen möchten, aber Sie sollten jeden Fall separat betrachten und sich Zeit nehmen, um Ihre Geschäftslogik vollständig zu verstehen, bevor Sie diese Regel brechen, damit Sie wissen, was in ihnen steckt Beispiel.

Sollte ich diese Transaktion als AUTONOMOUS_TRANSACTION machen?

Ein Anwendungsfall ist die Anmeldung - Sie können eine PROCEDURE haben, die eine andere PROCEDURE nennt die Aktionen des Benutzers zu protokollieren und unabhängig davon, ob die erste Aktion erfolgreich ist oder fehlschlägt Sie ein Protokoll der Aktion halten wollen und dafür sorgen, dass log ist COMMIT ted. In diesem Fall sollte die Protokollierung PROCEDURE eine AUTONOMOUS_TRANSACTION sein und eine COMMIT-Anweisung enthalten und die aufrufende Anweisung sollte (wahrscheinlich) keine haben.

Also, wenn die COMMIT ein PROCEDURE immer erforderlich ist, und ist unabhängig davon, ob der Anrufer COMMIT s andere Daten dann die PROCEDURE ein AUTONOMOUS_TRANSACTION machen. Wenn die PROCEDURE s zusammen gebündelt werden können und dann ROLLBACK als eine Gruppe, dann möchten Sie sie nicht AUTONOMOUS_TRANSACTION s machen.

-1

Ich würde vorschlagen, dass Sie diesen Artikel beziehen. Es wird Ihre Fragen klären.

AUTONOMOUS_TRANSACTION

Die pragma AUTONOMOUS_TRANSACTION weist den Compiler an den PL/SQL-Block nach dem pragma als autonomes (unabhängig) von der anrufenden Transaktion zu behandeln.

Sollten Sie es machen Autonome Transaktion hängt nur von den Kriterien der Nutzung ab. In beiden Fällen muss COMMIT innerhalb platziert werden.

Das folgende Beispiel wird es deutlich veranschaulichen.

CREATE OR REPLACE 
PROCEDURE testav 
AS 
    PRAGMA AUTONOMOUS_TRANSACTION; --Declaring is Autonomous Transaction. 
BEGIN 
    INSERT INTO testa VALUES 
    ('1','2',sysdate 
    ); 
    commit; 
END; 

DECLARE 
    lv_num NUMBER; 
BEGIN 
    testav; -- Calling the Procedure 
    lv_num:=to_number('av'); --This will fail to parse but the procedure call will be successfull even though the calling block has failed. 
END; 

/

+1

Dies ist eine Nur-Link-Antwort. Es wäre besser, die relevanten Punkte aus dem verknüpften Artikel in die Antwort aufzunehmen. – MT0

+0

Auch autonome Transaktionen sind leicht zu missbrauchen. Sie sollten den Leuten nicht raten, sie zu benutzen, wenn Sie nicht wissen, dass sie ein passendes Szenario haben. Das ist hier nicht der Fall. – APC

1

Hängt davon ab, was Sie tun möchten. Wenn Sie möchten, dass die Prozedur eine Standalone-Transaktion ist, würde ich empfehlen, pragma autonomous_transaction hinzuzufügen.

Ex: Erstes Szenario

  1. Update Tabelle 1
  2. Pragma AUTONOMOUS_TRANSACTION -> update Tabelle 2 -> commit
  3. Rollback

Tabelle 2 wird verpflichtet und Tabelle 1 werden zurückgerollt

Beispiel: zweites Szenario

  1. aktualisieren Tabelle 1
  2. Update Tabelle 2 -> commit
  3. Rollback

beide Tabelle 1 und 2 verpflichtet werden, weil es sie als eine Transaktion behandelt

Verwandte Themen