Closed. This question needs to be more focused。它当前不接受答案。












想要改善这个问题吗?更新问题,使它仅关注editing this post的一个问题。

9个月前关闭。



Improve this question




DbConnection.EnlistTransaction有什么作用?

最佳答案

DbConnection.EnlistTransaction 允许:

  • 将连接加入到 System.Transactions.Transaction 。它有一些限制:
  • 如果连接已经在参与“本地”事务( System.Data.Common.DbTransaction ),则连接可能会失败,并发生异常。 (这似乎取决于具体的连接实现:在这种情况下,Firebird 2不会引发异常, SqlConnection 以及可能大多数其他人都会引发异常。)
  • 如果连接已经连接到另一个System.Transactions.Transaction,并且该另一个事务仍处于事件状态,则它将失败,并发生异常。

  • 至少SqlConnection OleDbConnection OdbcConnection 支持重复加入同一事务。
    其他 DbConnection 实现可能有所不同。例如, HanaConnection (从HANA 2 SP3开始)在这种情况下抛出,这对于在连接字符串中未禁用连接自动登记的情况下总是显式登记的代码非常不便。
    如果连接具有当前正在使用的某些资源(例如,已打开的数据读取器正在使用),则其他提供程序也可能无法重新注册同一事务。 (这种情况在对这些连接的内部实现中进行检查还为时过早,要在意识到所提供的事务已经加入之前就已经完成了。)
  • 保留已加入连接的事务,前提是该事务不再处于事件状态。 (否则,尝试使用连接可能会因异常而失败,至少使用OdbcConnection会失败。)为此提供null作为事务。
    请注意,某些连接不支持此连接,例如 SqlCeConnection 抛出NullReferenceException,而 SQLiteConnection (至少到v1.0.105之前)抛出ArgumentNullException
    如果要将连接用于其他操作而不将其加入另一个事务中,则可能需要在事务完成后离开该事务。一些连接似乎会自动离开事务,而其他连接似乎不会。
    范围处置后的连接行为也可能会更改,这取决于先前的事务是否已分发。分发后,作用域处置可以在所有参与者都投票后结束(两个阶段的第一阶段都提交),从而导致作用域处置之后的代​​码与第二阶段同时执行,并同时包含在连接的自己的第二阶段中。 (See here。)根据连接实现,显式请求退出事务可能会减轻麻烦。
  • DbConnection.EnlistTransaction通常与 System.Transactions.Transaction.Current 一起使用。如果在 TransactionScope 中获取(打开)了连接,则不需要使用它:在这种情况下,该连接会自动将其自身加入当前事务中(除非其连接字符串另外用enlist=false指示)。但是同样,有些连接实现可能在这里也有所不同:有些默认情况下未启用自动登记,并且具有完全不同的语义(例如6.0版之前的FbConnection),或者使用了不同的连接字符串参数(例如使用MySqlConnection AutoEnlist )。

    09-11 20:36