Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 多重事务范围问题_C#_.net_Transactions - Fatal编程技术网

C# 多重事务范围问题

C# 多重事务范围问题,c#,.net,transactions,C#,.net,Transactions,我想创建一个事务,在子事务中写入一些数据,读回数据,然后回滚事务 using(var transaction = new TransactionScope()) { using(var transaction = new TransactionScope()) { // save data via LINQ / DataContext transaction.Complete(); } // Get back f

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

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:该操作对于事务的状态无效。”


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

您有两个嵌套的TransactionScope对象

而且没有试抓块


我想你会发现具体的答案是,你无法完成一个没有开始的交易,它处于无效状态。你的LINQ注释所在的地方有代码吗?实际是否建立了连接?

如果没有完整的堆栈跟踪,则无法调试此异常。根据上下文的不同,它有不同的含义。通常这意味着您正在做一些不应该在事务内部做的事情,但是在没有看到db调用或堆栈跟踪的情况下,任何人所能做的就是猜测。我知道的一些常见原因(我肯定这一点并不全面)包括:

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

  • 我肯定不知道所有可能的原因,但如果您在代码中发布完整的堆栈跟踪和实际的db调用,我会看一看,如果我看到任何东西,就会告诉您。

    您使用的是哪一个db?可能会有帮助,是的,嵌套的。但是为什么你链接了MSDN?因为链接的文章解释了为什么你会得到这个例外,也许吧?@boj:因为它有一个使用示例,有很好的注释解释了发生的事情和时间。安迪,谢谢你的回答。关于#3 re的问题:“任何违反隔离级别的操作”。以下内容是否会违反隔离级别?声明(atSmbol)someCount INT;更新dbo.Something SET(atSmbol)someCount=[someCount]=[someCount]+1,其中ID=123 In my usage(atSmbol)someCount是一个输出参数。如果是这样,这是否违反了隔离级别?声明(atSmbol)someCount INT;更新dbo.Something SET[SomeCount]=(atSmbol)SomeCount=[SomeCount]+1,其中ID=123注意,当我使用at符号时,它认为我试图标记某人以获取通知。