为什么DbContext.Database.CurrentTransaction始终为空?

时间:2017-02-09 09:02:49

标签: c# transactions dbcontext transactionscope distributed-transactions

  1. 无论如何在连接字符串中查找是否在任何事务中登记了DbContext而enlist = false? 我正在跟踪DbContext.Database.CurrentTransaction,但我注意到它总是为空。

  2. 我知道当enlist = false时,所有打开的连接都不会在环境事务中登记,是吗?

  3. 如果(2)是正确的,如何在使用TransactionScope的事务中登记DbContext?
  4. 最后,我注意到使用克隆的DependentTransaction 多个DbContext 多个线程,而enlist = false则不会将事务提升为分布式,但我想我是否仍能提交和回滚,以防在enlist = false时使用依赖事务发生异常?
  5. 如果(4)不正确,那么有没有办法完全避免 DistributedTransaction ,同时能够使用多个连接 >单一交易范围?
  6. 仅供参考,目前正在使用Oracle数据库;但是,将来MySQL也将开始运作。

    谢谢

1 个答案:

答案 0 :(得分:0)

我真的不能对1,2和3说些什么..但是:

  1. 分配对我来说并不是很清楚。但是,如果某些标准发挥作用,MS会将交易从LTM(Lightweigt Transaction Manger)升级到DTC。例如,如果您尝试在一个事务中访问不同的数据库..

  2. 从LTM升级到DTC或如果强制升级将会导致系统崩溃。到目前为止,我还没有找到改变这种行为的方法。这就是为什么你需要考虑一般的交易。如果有可能避免多数据库访问,您可以重新考虑您的交易。

  3. 有关详细信息,我建议您Why is my TransactionScope trying to use MSDTC when used in an EF Code First app?MSSQL Error 'The underlying provider failed on Open'How do I use TransactionScope in C#?