DbConnection.EnlistTransaction做什么?
答案 0 :(得分:5)
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
。 DbConnection.EnlistTransaction
通常与System.Transactions.Transaction.Current
一起使用。如果在TransactionScope
内获取(打开)连接,则不需要使用它:在这种情况下,连接会自动在当前事务中登记自己(除非其连接字符串另外用enlist=false
指示) 。但是再一次,一些连接实现也可能在这里有所不同:有些连接默认情况下没有启用自动登记,并且它具有完全不同的语义(如6.0版本之前的FbConnection),或者使用不同的连接字符串参数(例如MySqlConnection
使用AutoEnlist
)。
答案 1 :(得分:3)
它允许您协调多个连接之间的事务。如果使用TransactionScope,连接将自动登记在事务中。否则,您必须使用现有事务进行登记。