2012-06-09 10 views
11

ネストされたトランザクションが何のために良いのか理解していません。ネストされたトランザクションをコミットすると何もコミットされません。ちょうど、@@TRANCOUNTが減少します。そしてROLLBACKはすべてをロールバックします。ネストされたトランザクションの目的

BEGIN TRANSACTION 
    //do an update 
    BEGIN TRANSACTION 
    //do an insert 
    COMMIT TRANSACTION 
COMMIT TRANSACTION 

これとの違いは何ですか:

BEGIN TRANSACTION 
    //do an update 
    //do an insert 
COMMIT TRANSACTION 

ネストされたトランザクションを使用し、それらがどのように違いを作るべきであるなぜ私に例を教えてください。

よろしく、ペタル

答えて

8

ネストされたトランザクションは、あなたのコードは、実際に彼らがコミットあなたトランザクションをコミットせずに取引自体を使用している他のコード(たとえばのSP)を呼び出すことができます。

つまり、セーフポイントを使用してトランザクション内でロールバックすることができます。

これ専用のCodeProject articleがあります。

+0

ネストされたトランザクションを使用せずにセーフポイントを使用できます。ストアドプロシージャは良い点です(私はそれについて考えたことはありません)。しかし、トランザクションでストアドプロシージャを使用しない(または他のコードを呼び出さない)場合、ネストされたトランザクションが必要なのはなぜですか?私はネストされたトランザクションの例を絶えず見ており、その点については私は見ていません。 –

+0

ネストしたトランザクションは、外部トランザクションコードを呼び出すときにのみ有効です。 –

+1

私はあなたに同意し、彼らは外部のトランザクションコードを呼び出すのに便利だと思います。ネストされたトランザクションを処理するSQL Serverの技術的能力は重要であり、すべてのDBシステムで利用可能ではありません。いくつかのケースがあります(前述のSPのように - [SET XACT_ABORT ON']を使用する必要があります)(http://stackoverflow.com/questions/1150032/what-is-the-benefit-of-using-set -xact-at-in-a-stored-procedure-abort-on-a-store-procedure))、それらは "自然に"ネストすることができる。明示的なネストされたトランザクションも使用したことはありません。 – Lucero

0

他のSPコールを含む1つのSPをコールするシナリオがある場合。内部SPもアプリケーションから独立して呼び出すことができます。その場合、インナー取引(インナーSP)と親SPの両方に内部取引を行う必要があります。

関連する問題