13

DbConnection.EnlistTransactionは何をしますか?

4

2 に答える 2

10

DbConnection.EnlistTransaction許可:

  • に接続を参加しますSystem.Transactions.Transaction。いくつかの制約があります。
    • 接続がすでに「ローカル」トランザクション(System.Data.Common.DbTransaction)に参加している場合、例外を除いて失敗する可能性があります。(これは具体的な接続の実装に依存しているようです。Firebird2はそのような状況で例外をスローせずSqlConnection、おそらく他のほとんどの場合はスローします。)
    • 接続がすでに別のに参加していてSystem.Transactions.Transaction、この他のトランザクションがまだアクティブである場合、例外を除いて失敗します。
  • 同じトランザクションへの繰り返しの参加は、少なくとも、、およびによってサポートさSqlConnectionOleDbConnectionますOdbcConnection
    他のDbConnection実装は異なる場合があります。たとえば、HanaConnection(HANA 2 SP3の時点で)このような場合にスローされます。これは、接続の自動登録が接続文字列で無効にされていないときに常に明示的に登録するコードには非常に不便です。
    開いているデータリーダーで使用されているなど、接続に現在使用されているリソースがある場合、他のプロバイダーも同じトランザクションに再参加できない可能性があります。(このケースは、提供されたトランザクションがすでに参加していることに気付く前に行われた、これらの接続の内部実装の早すぎるチェックのように見えます。)
  • トランザクションがアクティブでなくなった場合に限り、接続が参加したトランザクションを終了します。(そうでない場合、接続を使用しようとすると、少なくとも例外が発生して失敗する可能性がありますOdbcConnection。)nullこのためのトランザクションとして提供します。をスローする、や(少なくともv1.0.105まで)をスローする
    など、一部の接続はこれをサポートしていないことに注意してください。 別のトランザクションに参加せずに他の操作に接続を使用する場合は、トランザクションの完了後にトランザクションを終了する必要がある場合があります。一部の接続はトランザクションを自動的に終了するように見えますが、他の接続はそうではないようです。SqlCeConnectionNullReferenceExceptionSQLiteConnectionArgumentNullException

    スコープ破棄後の接続動作も、前のトランザクションが配布されたかどうかによって変わる可能性があります。配布されると、スコープの破棄はすべての参加者が投票するとすぐに終了でき(2つのフェーズの最初のフェーズがコミットされます)、スコープの破棄に続くコードが、接続の自身の2番目のフェーズに同時に含まれる2番目のフェーズと同時に実行されます。 。(ここを参照してください。)接続の実装によっては、トランザクションを終了するように明示的に要求すると、問題が軽減される場合があります。

DbConnection.EnlistTransaction通常、と一緒に使用されSystem.Transactions.Transaction.Currentます。:内で接続が取得(開かれる)される場合は、これを使用する必要はありませんTransactionScope。そのような場合、接続は自動的に現在のトランザクションに参加します(接続文字列で別の方法で指示されている場合を除くenlist=false)。ただし、ここでも、接続の実装によっては異なる場合があります。デフォルトで自動登録が有効になっておらず、セマンティクスがまったく異なるもの( 6.0バージョンより前のFbConnectionなど)や、異なる接続文字列パラメーターを使用するもの(MySqlConnectionを使用しますAutoEnlist)。

于 2017-05-16T09:48:18.463 に答える
5

これにより、複数の接続間のトランザクションを調整できます。TransactionScopeを使用する場合、接続は自動的にトランザクションに参加します。それ以外の場合は、既存のトランザクションで参加を行う必要があります。

于 2012-10-12T17:15:13.607 に答える