2016-10-10 13 views
0

サードパーティのAPIとしてOracleデータベースに格納されているプロシージャはほとんどありません。これらのapi-callを1つのトランザクションでチェーンしたいと考えています。それはできますか? 私はthat answerから理解していますが、セーブポイントを使用できます。しかし、これらのAPIがすでにコミットステートメントを持っていれば動作しますか? Oracleはネストされたコミットをロールバックしますか?Oracleのトランザクション

また、Oracleはセーブポイントと同時実行性をどのように使いますか? I.図がある場合

connection#1 (my api call)    connection#2 (3rd party api call) 
savepoint sp1; 
             savepoint sp2; 
update t1 where id=1 set val=1;   update t1 where id=2 set val=2; 
             commit; --done 
call bad_stored_proc(); 
rollback to sp1; 

ここではどうなりますか?ロールバックは行(id = 1、val = 1)、または両方の行にのみ影響しますか?

+0

すでにコミットされているものはロールバックできません。だから、このような状況では、一連の呼び出しが重要で、正確に何をロールバックしたいのですか。明らかに、ベンダーSPのコミットされた作業をロールバックすることはできません。したがって、自分のコードに集中する必要があります。あなたのコードはベンダのSp実行結果に依存しますか?それは呼び出しのシーケンスで行く場所。それはベンダーのSPへの呼び出しの最初か最後か途中かになりますか?あなたがベンダーのSPを呼び出すことを避けるか、ロールバックするときに避けられないことがある(非常に注意する必要があります、それらのSPが何をするかによって異なります)。 –

+1

(ベンダーのSP)がコミットすると、「バグ」となる可能性があります。そうしなければならない場合、ベンダーは非常に慎重に処理する必要があります。 –

答えて

1

ネストされたコミットはロールバックされません。彼らは約束している。

最善の方法は、サードパーティのAPIをプロシージャにラップし、そのプロシージャをPRAGMA AUTONOMOUS_TRANSACTIONでマークすることです。それは第三者のAPIが自分の仕事だけをコミットするように制限します。つまり、ロールバックすると、サードパーティのトランザクション作業がコミットされますが、他の作業は実行されません。

これは、大部分の設計状況でデータが論理的に破損するため、一般的には本当に悪いことです。私はあなたがそれを取り除くことができる設計状況に直面していることはほとんどありません。

1

プロシージャ内でサードパーティプロシージャがコミットを呼び出す場合、プロシージャ自体を変更することなく、それらをすべて1つのトランザクションとして実行する方法はありません。

オラクルでは、ネストされたコミットまたはネストされたトランザクションはサポートされません。コミットとは、データベースに変更を書き込むことと、変更をロールバックするオプションを失うことだけです。

セッションパラメータを使用して、サードパーティのプロシージャにコミット文が含まれているかどうかを確認できます。このセットで

alter session disable commit in procedure; 

、コミットしようとすると任意の手順は、エラーメッセージがスローされます。*

  • このパラメータが何をするかの私の誤解を補正するためのマシューMcPeakのおかげで。
関連する問題