5

TransactionScopeこの記事について読みましたが、まだ2つのことを理解していません。

  1. 実行されると、呼び出されるまで実際にSqlCommand.ExecuteNonQueryは実行されませんか?scope.Complete()それが本当ならスコープ内で実行されたすべての操作が残り、またはを待つのですscope.Complete()scope.Rollback()
  2. TransactionScope実行されないようにする方法がインスタンス化され、またはSqlCommand.ExecuteNonQuery待機するのはいつですか?それはいくつかの「場所」を作成し、どういうわけかそれを知っていて、そこに指示を入れますか?scope.Complete()scope.Rollback()SqlCommand
4

4 に答える 4

6

[1] SqlCommand.ExecuteNonQueryが実行されると、scope.Complete()が呼び出されるまで実際には実行されませんか?

いいえ、これは正しくありません。コマンドは、を呼び出した行で実行されますExecuteNonQuery。ただし、すべての変更がどこに保存されているかを知ることは興味深いことです。変更はサーバー側の影響を受けるテーブルに直接送信されるのではなく、一時的な場所(ここでもサーバー側)に保存されます。これにより、2番目の質問に対する回答が得られます。

[2] TransactionScopeがインスタンス化されると、SqlCommand.ExecuteNonQueryが実行されないようにし、scope.Complete()またはscope.Rollback()を待機する方法を教えてください。

それ自体を防ぐことはできませんが、アクション実行されますが、アクションの結果は一時的な場所に保存されるため、これらの変更をメインテーブルとマージするか、これらの変更をscope.Commit()破棄する必要がありますscope.Rollback()(または特定のデータベースデータプロバイダーの変更を破棄します)

于 2012-07-19T10:55:58.210 に答える
1

TransactionScopeは、多くのものを隠します。

TransactionScopeを作成するとき、その中で行うことはすべて、データベーストランザクションのコンテキスト内にあります。したがって、SQLステートメントはすぐに実行されますが、その効果はトランザクション内にあるため、トランザクションがコミットされるまで、他のプロセスはSQLステートメントが発生したことを認識しません。

単一のデータベースのみを操作している場合は、トランザクションがそれに対して開かれ、コミットされるか、.Complete()であるかどうかに応じてロールバックされます。また、TransactionScopeのコンテキスト内で例外が発生した場合、トランザクションはロールバックされます。

複数のデータベースを使用している場合は、それぞれにトランザクションが作成され、Microsoft Distributed Transaction Coordinator(MSDTC)がトランザクション全体を管理します。.Complete()を実行すると、MSDTCは個々のトランザクションにコミットするように指示します。

注MSDTCはデータベースに限定されません。詳細については、ここを参照してください。

于 2012-07-19T10:49:05.203 に答える
0

トランザクションスコープは、コードの実行を妨げるものではなく、トランザクションがコミットされるのを防ぎます。したがって、の場合SqlCommand.ExecuteNonQuery、トランザクション内にあるため、SqlCommandトランザクションコーディネーターを調べて、それがトランザクション内で呼び出されたことを確認します。したがって、SQL Serverに接続すると、トランザクションが維持されるため、SQLはデータベースへのデータですが、トランザクションがコミットされない限り(または誰かが「ダーティリード」を実行しない限り)読み取ることはできません。completeが呼び出されない場合は、TransactionScopeが破棄されるときにロールバックされ、SQLは挿入(またはその他の方法)を元に戻すことができます。

トランザクションを使用するもの(他のデータベーステクノロジなど)は、トランザクションをサポートするために.Netコードを実装する必要があります。

トランザクションは基本的にデータベースで使用されますが、理論的には、それをサポートするために他のコードを作成することもできます。

しかし、あなたの質問に答えるために、コードはComplete()メソッドが呼び出されるまで停止されず、実行されますが、トランザクション内で停止されます。

于 2012-07-19T10:51:02.023 に答える
0

これは、MSDTCがトランザクションを確認するためのトレースを有効にできる質問に役立つ場合があります

詳細については、リンクを参照してくださいhttp://support.microsoft.com/kb/899115

お役に立てれば..

于 2012-07-19T10:52:10.380 に答える