【问题标题】:What does DbConnection.EnlistTransaction do? [closed]DbConnection.EnlistTransaction 做什么? [关闭]
【发布时间】:2012-10-12 17:10:18
【问题描述】:

DbConnection.EnlistTransaction 有什么作用?

【问题讨论】:

  • 在我检查之前我不会在这里问..
  • 文档 - 如上所述 - 在“备注”下很好地描述了它。
  • 我同意提问者的观点。文档很清楚。我什么时候可以提交,什么时候可以关闭连接等。我检查了 MSDN,然后检查了 Stack 只是为了找到你的聪明评论和否决票。

标签: c# entity-framework transactions


【解决方案1】:

DbConnection.EnlistTransaction 允许:

  • 加入到System.Transactions.Transaction 的连接。它有一些限制:
    • 如果连接已经参与“本地”事务 (System.Data.Common.DbTransaction),它可能会因异常而失败。 (这似乎取决于具体的连接实现:Firebird 2 在这种情况下不会抛出异常,SqlConnection 并且可能大多数其他人都会抛出异常。)
    • 如果连接已加入另一个 System.Transactions.Transaction,并且此其他事务仍处于活动状态,它将失败并出现异常。
  • 支持重复加入同一个事务,至少 SqlConnectionOleDbConnectionOdbcConnection.
    其他 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)。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 只有在事务范围内获取连接时才能保证自动登记。外取而内用,则不入伍。 (至少我已经看到,对于在另一个事务范围内首次获取的连接:为了将它与下一个(在第一个范围完成后)一起使用,它需要显式登记它。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 2012-11-07
    • 2015-01-12
    • 2013-02-08
    • 2011-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多