sql >> データベース >  >> RDS >> Sqlserver

TransactionScope.Complete() が呼び出されない場合でも、ネストされたトランザクションがコミットされるのはなぜですか?

    まず、 SQL Server でネストされたトランザクションなどはありません .これは重要です。

    次に、両方の TransactionScopes が conn1 を使用するため、(SQL Server レベルで) @@TRANCOUNT をインクリメントします。 BEGIN TRANSACTION ごとに

    簡単な説明:内側のトランザクションをロールバックすると 両方 がロールバックされるため、外側のトランザクションがコミットされると、内側のトランザクションがコミットされます。 取引

    つまり、COMMIT TRANSACTION (.Complete によって暗示されます) および .Dispose ) @@TRANCOUNT を減らします while ROLLBACK TRANSACTION (.Dispose によって暗示されます) のみ) ゼロに戻します。したがって、「ネストされたトランザクションなどがない」ため、内部ロールバックは抑制されます

    内部スコープで conn2 を正しく使用した場合、2 つのトランザクションはデータベース サーバー レベルで無関係であるため、期待どおりに動作します。どこが重要なのか...



    1. 1つのSQLクエリに複数の行を挿入する方法–今週のインタビュー質問#069

    2. Javaを使用してPostgresqlで画像を保存および取得する

    3. PHPを使用してWiktionaryXMLデータダンプをMySQLデータベースに解析します

    4. MySQLのスクリプトからデータベースを作成する方法