こんにちは、TSQL のネストされたトランザクションに関する私の現在の理解では、複数のトランザクション (1 つの「外部」トランザクション内にネストされた複数のトランザクション) がある場合、すべてのトランザクションをコミットする必要があります (「外部」トランザクションが最後のトランザクションです)。データベースに加えられる変更。コミットの数が開いているトランザクションの数よりも少ない場合、トランザクションに関連する変更は行われません。これは、ネストされたトランザクションがどのように機能するかの正しい概要ですか?
2 に答える
の説明COMMIT
は正しいです。
Kalen Delaney には、あなたが説明したのと同じ種類の行動を取り上げた記事があります。
ただし、Kalen の記事で説明したようにROLLBACK
、ネストされたトランザクション内では、ロールバックが発生する内部トランザクションだけでなく、外部トランザクション全体がロールバックされます。
次の結果に注意してください。
BEGIN TRAN
SELECT @@trancount
BEGIN TRAN
SELECT @@trancount
BEGIN TRAN
SELECT @@trancount
ROLLBACK TRAN
SELECT @@trancount
これについては、MSDN の記事Nesting Transactionsで説明されています。
トランザクション名を持たない ROLLBACK WORK または ROLLBACK TRANSACTION ステートメントは、ネストされたすべてのトランザクションをロールバックし、@@TRANCOUNT を 0 に減らします。一連のネストされたトランザクションの中で最も外側のトランザクションのトランザクション名を使用する ROLLBACK TRANSACTION は、ネストされたトランザクションは @@TRANCOUNT を 0 にデクリメントします。すでにトランザクションに参加しているかどうかわからない場合は、@@TRANCOUNT を選択して 1 以上かどうかを確認します。@@TRANCOUNT が 0 の場合、トランザクションに参加していません。
要するに、あなたの答えはイエスです。ネスティング トランザクションから:
内部トランザクションのコミットは、SQL Server データベース エンジンによって無視されます。トランザクションは、最も外側のトランザクションの最後に実行されたアクションに基づいて、コミットまたはロールバックされます。外側のトランザクションがコミットされると、内側のネストされたトランザクションもコミットされます。外部トランザクションがロールバックされると、内部トランザクションが個別にコミットされたかどうかに関係なく、すべての内部トランザクションもロールバックされます。
ROLLBACK に関しては、外部トランザクション全体を ROLLBACK することだけが許可されています。