2017-02-02 4 views
-1

テーブルに挿入/削除を実行しているパッケージにプロシージャを作成しました。トランザクションが成功した後、コミットされました。このようなDMLの後にコミットを実行すると、どのような影響がありますか?

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 ; 

私はAUTONOMOUS_TRANSACTIONとしてこの取引をするべきでしょうか?このようなコミットをプログラムに入れることの効果は何ですか?

答えて

4

このようなコミットをプログラムに加える効果は?あなたの現在のトランザクションを終了し、トランザクションで実行 恒久的なすべての変更を行うことがCOMMIT文を使用し

目的

Oracle DocumentationはとしてCOMMITを説明しています。トランザクションは、 という一連のSQL文で、Oracle Databaseは単一の 単位として扱います。このステートメントは、トランザクション内のすべてのセーブポイントも消去し、 はトランザクションロックを解放します。

あなたは3 PROCEDUREがあり、それぞれがCOMMIT文が含まれている場合は、例外が後者で発生した場合、最初の2からの変更は、すでにCOMMITテッドになるように、あなたはそれらをすべて、そしてROLLBACKを3つすべてを実行することはできません。一般的なルールとして

、あなたはPROCEDUREまたはFUNCTIONCOMMITを使うべきではありませんが、彼らは一緒に複数のアクションをバンドルすることができるようにトランザクションをCOMMITするために呼び出し側に任せるべきです。

もちろん、このルールに違反したい場合もありますが、このルールを破る前にビジネスロジックを完全に理解するためには、それぞれのケースを個別に検討し、時間を取るべきです。したがって、それぞれにCOMMITインスタンス。

AUTONOMOUS_TRANSACTIONとしてこの取引を行う必要がありますか?あなたは、ユーザーのアクションをログに記録する別のPROCEDUREを呼び出すと、関係なく、最初のアクションが成功したかどうかにあなたが行動のログを保存し、それを確実にしたい失敗しPROCEDUREを有することができる -

つのユースケースは、ログインしていますログはCOMMITです。この場合、ログPROCEDUREAUTONOMOUS_TRANSACTIONであり、COMMITステートメントが含まれていて、呼び出しステートメントには(おそらく)あるべきではありません。 COMMITPROCEDURE 1のが常に必要とされている場合

ので、呼び出し側COMMITの他のデータは、その後PROCEDUREAUTONOMOUS_TRANSACTIONを作るかどうかとは無関係です。 PROCEDUREを一緒にバンドルしてからROLLBACKをグループにまとめると、AUTONOMOUS_TRANSACTIONにする必要はありません。

-1

この記事を参考にしてください。あなたの質問を明確にします。

AUTONOMOUS_TRANSACTION

プラグマAUTONOMOUS_TRANSACTIONは、呼び出し元のトランザクションから自律(独立)としてプラグマ次のPL/SQLブロックを処理するためにコンパイラに指示します。

自律型トランザクションは、使用の基準にのみ依存してください。どちらの方法でもCOMMITは内部に配置されなければなりません。

以下の例では、明確に説明します。

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

これはリンクのみの回答です。答えにリンクされた記事の関連ポイントを含める方が良いでしょう。 – MT0

+0

また、自律型トランザクションは誤用しやすいです。適切なシナリオがあることがわかっていない限り、人々に使用を勧めるべきではありません。ここではそうではありません。 – APC

1

あなたが何をしたいのかに依存します。プロシージャをスタンドアロントランザクションにしたい場合は、pragma autonomous_transactionを追加することをお勧めします。

例:最初のシナリオ

  1. 更新表1
  2. プラグマAUTONOMOUS_TRANSACTION - >更新テーブル2 - >コミット
  3. ロールバック

表2は、コミットされ、表1になりロールバックする

例:第2のシナリオ

  1. 更新表1
  2. 更新テーブルは2 - >コミット
  3. 、それはひとつのトランザクションとして扱います原因ロールバック

両方の表1及び2がコミットされます

  • 何がある

  • 関連する問題