c# - DbConnection.EnlistTransaction 有什么作用?

标签 c# entity-framework transactions

<分区>

DbConnection.EnlistTransaction 有什么作用?

最佳答案

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 ,它会抛出一个 NullReferenceException,并且 SQLiteConnection (至少到 v1.0.105),它会抛出一个 ArgumentNullException
    如果要将连接用于某些其他操作而不将其加入另一个事务,则可能需要在事务完成后离开该事务。有些连接似乎会自动离开交易,有些似乎不会。
    范围处置后的连接行为也可能会根据先前的事务是否已分发而改变。分布式时,范围处置可以在所有参与者投票后立即结束(两个阶段的第一阶段提交),导致范围处置之后的代​​码并发执行到第二阶段,同时包含到自己的连接的第二阶段. ( See here 。)根据连接实现,明确要求离开事务可能会减轻麻烦。

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

关于c# - DbConnection.EnlistTransaction 有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12863950/

相关文章:

c# - 父亲,两个儿子,999幅画

design-patterns - 对于自动生成新对象(auto_increment id)的事务来说,工作单元是一个好的模式吗?

Azure 无法将事务编码到弹性事务的传播 token 中(适用于 MSDTC)

c# - 以编程方式创建代码优先迁移

java - 如何将一对一的基本元素加入到实体中?

transactions - Spring 3.1 : jdbcTemplate auto commit to false.

c# - 将 SQLGeography 多边形重新格式化为 JSON

c# - 大型数据集上的 System.Numerics.Vector<T>

c# - Gridview 中的索引超出范围错误

c# - 如何为依赖于 DbEntityEntry 的对象创建单元测试