我想创建一个事务,在子事务中写入一些数据,读回数据,然后回滚事务.
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调用,我会看看并告诉你我是否看到了什么.