加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 多个TransactionScope问题

发布时间:2020-12-15 18:23:07 所属栏目:百科 来源:网络整理
导读:我想创建一个事务,在子事务中写入一些数据,读回数据,然后回滚事务. using(var transaction = new TransactionScope()) { using(var transaction = new TransactionScope()) { // save data via LINQ / DataContext transaction.Complete(); } // Get back fo
我想创建一个事务,在子事务中写入一些数据,读回数据,然后回滚事务.
using(var transaction = new TransactionScope()) 
{
     using(var transaction = new TransactionScope()) 
     {
          // save data via LINQ / DataContext
          transaction.Complete();
     }
     // Get back for assertions
     var tempItem = // read data via LINQ / DataContext THROWS EXCEPTION
}

但是在阅读时我得到“System.Transactions.TransactionException:该操作对于事务的状态无效.”

我应该如何设置事务属性以避免这种情况?

解决方法

如果没有完整的堆栈跟踪,则无法调试此异常.根据具体情况,它有不同的含义.通常这意味着你正在做一些你不应该在事务中做的事情,但是没有看到db调用或堆栈跟踪所有人都可以做的就是猜测.我所知道的一些常见原因(我认为这绝不是全面的)包括:

>在嵌套的TransactionScope中访问多个数据源(即不同的连接字符串).这会导致升级到分布式事务,如果您没有运行DTC,它将失败.答案通常不是启用DTC,而是清理事务或使用新的TransactionScope包装其他数据访问(TransactionOptions.RequiresNew).
> TransactionScope中未处理的异常.
>任何违反隔离级别的操作,例如尝试读取刚刚插入/更新的行.
> SQL死锁;在某些情况下,事务甚至会自行死锁,但如果#1适用,将其他操作隔离到新事务中可能会导致死锁,如果您不小心的话.
>交易超时.
>数据库中的任何其他错误.

我绝对不知道每一个可能的原因,但是如果你在你的代码中发布完整的堆栈跟踪和实际的db调用,我会看看并告诉你我是否看到了什么.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读