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)
清理您的事务或包装其他数据访问事务范围内未处理的异常
我肯定不知道所有可能的原因,但如果您在代码中发布完整的堆栈跟踪和实际的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符号时,它认为我试图标记某人以获取通知。