Fré*_*ric 7

DbConnection.EnlistTransaction 允许:

  • 加入连接到System.Transactions.Transaction.它有一些限制:
    • 如果连接已经参与"本地"事务(System.Data.Common.DbTransaction),则它可能会因异常而失败.(这似乎取决于具体的连接实现:Firebird 2在这种情况下不会抛出异常,SqlConnection并且可能大多数其他人都抛出异常.)
    • 如果连接已连接到另一个System.Transactions.Transaction,并且此另一个事务仍处于活动状态,则它将失败并出现异常.
    • 多次参加相同的事务支持,至少SqlConnection,OleDbConnectionOdbcConnection.
      如果连接当前正在使用某些资源,例如被打开的数据读取器使用,则可能会失败.(这种情况看起来像是在过早检查这些连接的内部实现,在实现已提供的事务已经加入之前完成.)
      其他DbConnection实现可能有所不同.例如,HanaConnection(在HANA 2 SP3中)抛出这种情况,这对于在其连接字符串中未禁用连接自动登记时始终明确登记的代码非常不方便.
  • 如果事务不再活跃,则保留连接已登记的事务.(否则,尝试使用连接可能会失败,但至少有一个例外OdbcConnection.)null作为事务提供.
    请注意,某些连接不支持此功能,例如SqlCeConnection,抛出a NullReferenceException,并且SQLiteConnection(至少高达v1.0.105)会抛出一个ArgumentNullException.
    如果您希望将连接用于某些其他操作而不在另一个事务中加入,则可能需要在事务完成后退出事务.有些连接似乎是自动离开交易,有些则似乎没有.
    范围处理后的连接行为也可能会发生变化,具体取决于先前的事务是否已分发.分发时,范围处理可以在所有参与者投票后立即结束(两阶段提交的第一阶段),使范围处理后的代码同时执行到第二阶段,同时包含在连接的第二阶段中.(见这里.)根据连接实现,明确要求离开交易可以减轻麻烦.

DbConnection.EnlistTransaction通常用于System.Transactions.Transaction.Current.如果TransactionScope在以下情况下获取(打开)连接,则不需要使用它.在这种情况下,连接会自动在当前事务中登记(除非其连接字符串另有规定enlist=false).但是再一次,一些连接实现也可能在这里有所不同:有些连接默认情况下没有启用自动登记,并且它的语义非常不同(比如6.0版本之前的FbConnection),或者使用不同的连接字符串参数(如MySqlConnection使用AutoEnlist).


Ran*_*der 5

它允许您协调多个连接之间的事务。如果您使用 TransactionScope,连接将自动登记在事务中。否则,您必须使用现有事务进行登记。