繁体   English   中英

具有未提交的第一个事务的TransactionScope在分布式事务上失败

[英]TransactionScope with uncommited first transaction fails on distributed transaction

尝试调试某些内容时,我发现有效执行以下操作的代码:

  1. 创建一个TransactionScope
  2. 创建一个事务(在本例中为nHibernate tx,但不是很重要)
  3. 创建第二个事务(在本例中为标准ADO.Net Tx)
  4. 进行第二笔交易
  5. 在交易范围内调用Complete()
  6. 处置交易范围。

现在-无论如何创建事务而不提交都可能不是一个好主意-尤其是在拥有(并且是错误修复)的情况下。

但是,当进行测试时-我尝试了以上各项的各种组合(提交所有事务,某些事务,没有事务(即仅TScope)提交第一个事务,而不提交第二个事务,添加其他事务等),并且在所有情况下,我发现以下内容是真实的:

仅当我未能提交第一个事务并且事务范围已分发时,TScope的处置才会失败,并且:

System.InvalidOperationException:该操作对登记的当前状态无效。

我现在很好奇,想知道为什么会这样吗?

我怀疑您看到的问题已被以下其中一项覆盖: https : //nhibernate.jira.com/issues/?jql=project%20%3D%2010000%20AND%20labels%20%3D%20TransactionScope

我不完全确定会发生什么,但是我已经看到了类似的行为,例如,如果NH参与了环境事务,并且该事务后来变得分散了,则调用TransactionScope.Complete()可能会挂起20秒,然后失败。

即使您不使用NH事务,NH也会尝试加入TransactionScope。 在这种情况下,NH将在环境事务的Prepare()阶段刷新更改。 它将在db连接上执行此操作,但是它也已加入事务,并且将获得其自己的Prepare()调用。 不幸的是,我无法找出确切的问题,但是我怀疑会发生什么,在某些情况下,数据库连接Prepare()将在NHibernate的Prepare()之前调用。 后者将尝试继续使用db连接,并且看来这会导致某种死锁。

使用NH事务并在完成事务作用域之前提交此事务,将使NH在基础数据库连接进入准备阶段之前清除其更改。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM