The operation is not valid for the state of the transaction.

DTC TIMEOUT
The operation is not valid for the state of the transaction.


解决方法:TransactionScope ts = new TransactionScope(TransactionScopeOption.Required, new TimeSpane(0, 5, 0)) //五分鐘。預設是一分鐘。

1.没事不要用TransactionScope,这玩意并不像文档里说的那样,只有"必要"的情况下,才会
升级本地事务到分布式事务.实际情况是:在Scope中,只要你打开两条连接,就算是这俩连接
都是相同的数据库,也会发生分布式事务.据说,同样的操作,分布式事务要慢上10倍.

2.TransactionScope被Abort时(比如Timeout),不会释放它持有的连接.这是一个bug,内部有
一个hotfix出来,但是还没有发布。

3.在比较大的负载情况下(不大的情况也有,但是少.不能确认是否是负载的问题.),可能会存
在System.Transactions.CommittableTransaction.Commit被永远阻塞的情况.后果是:你的
方法永远不会返回,TransactionScope拿到的连接永远不会返回给连接池,从数据库端看这些
连接状态都正常,从你的应用程序中看,它们都是活动的,所以,你永远都不可能再使用它们,
它们成了僵尸...这是一个已经确认的bug,但是没有hotfix.

4.如果不得不使用TransactionScope,先研究研究kb916002.

5.如果可能,不要用分布式事务。

posted @ 2008-11-25 21:21  HiEagle  阅读(3345)  评论(0编辑  收藏  举报