多个TransactionScope问题

boj*_*boj 6 .net c# transactions

我想创建一个事务,在子事务中写入一些数据,读回数据,然后回滚事务.

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
} 
Run Code Online (Sandbox Code Playgroud)

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

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

And*_*dyM 9

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

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

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