在.Net中使用TransactionScope 可以对括进去的代码进行事务处理,使用方法如下。

using (System.Transactions.TransactionScope scope = new System.Transactions.TransactionScope())
{
   //代码逻辑
}

如果在里面的代码出现异常(即便含有try..catch.异常捕获),则会在代码最后的“}”处触发“已中止事务”的异常,不调试的话前台返回的就是这个异常,如下图:

这时候需要断点调试里面的代码,看看是否有异常。

如果遇到“此操作对该事务的状态无效”错误,一般断点调试不会准确命中问题语句,我遇到的例子是在conn.Open()触发的异常,这打开数据库连接一般不可能会有错误,通过网上寻找也几乎没有问题的解答,后来自己研究,我总结了会有以下可能:

1、MSDTC服务开启中,但有问题,尝试重启(net start msdtc)

2、可能是处理时间过长导致超时,设置超时时长。new TransactionScope(TransactionScopeOption.Required, 600000)

3、平常没问题极少数遇到时,考虑是否有重复数据。一个事务中对同一条数据进行了多次处理,在第二次处理的时候会报错。或有多个一样的数据进行了处理。(如果是先select然后for循环的处理且平常不报错,一般是这种情况)