【开发心得】一招减少msdtc时间3分钟,但还有未解之谜

最近解决了一个诡异的问题,MSDTC默认超时造成事务被取消,业务被迫中断,好在没有一直跟MSDTC耗着,而是通过其他方式解决了,但最后还是留下了两个未解之谜。对用到MSDTC处理SQL事务的朋友应该有借鉴作用,欢迎分享。

目录

故障现象

超时问题

一招解决

未解之谜


故障现象

之前已经碰到过关于MSDTC超时的问题,详见下面这篇文章。

【开发心得】(MS DTC)已取消此分布式事务解决方案之一

但这次碰到的不同,明明设置了超时20分钟,但是到了10分钟的时候,事务还是被取消了。下图是跟踪出来的错误提示,可以看到红框里的时间,正好都是10分钟左右,相差不超过30秒。

System.Transactions.TransactionException: The operation is not valid for the state of the transaction. ---> System.TimeoutException: Transaction Timeout --- End of inner exception stack trace ---

 System.Exception: Microsoft 分布式事务处理协调器(MS DTC)已取消此分布式事务。

超时问题

一开始,思路都是围绕着超时问题去解决的,结合之前的文章,下面的代码就是正常的配置。

也用chatGPT帮忙,结果最后发现,MSDTC默认的最长超时时间就是10分钟。chatGPT也提供了修改超时的方法,但是目前服务器上的版本并不支持,根本没有修改的地方,利用注册表修改也没用。

换服务器版本几乎不可能,动静太大,客户还在等着做业务。怎么办?

  <system.transactions>
    <defaultSettings timeout="00:20:00"/>
  </system.transactions>
        TimeSpan defaultTimeout = TransactionManager.DefaultTimeout;

        public DBScope(DBHelp dbHelp)
        {
            this.dbHelp = dbHelp;
            dbHelp.SetScope(this);
            this.transactionScope = new TransactionScope(TransactionScopeOption.Required, defaultTimeout);//超时取config文件
            Console.WriteLine("Scope create...");
        }

一招解决

经过1天的折腾,尝试了各种办法修改DTC的超时时间,结果都不行。不过这次心态挺好的,因为同时还要处理其他工作,一点儿都没有着急。

有时候,放松=成功。

经过一晚上充足睡眠,早上起来,想起来之前在本地测试的时候,这个事务处理的时间很短,服务器上怎么会慢呢?越想越不对劲,于是就想到了问chatGPT这样一个问题:

看红框部分,感觉有可能是个问题。之前数据不多,索引并没有全部加,想到了就做。

于是,经过一番折腾,终于把几个设计事务的表全部加上索引。经过测试,如下图,一下子缩短了3分钟!成功解决问题!

未解之谜

这是问题虽然解决了,但是还是留了两个未解之谜:

1、为什么DTC的默认超时10分钟无法调整?而且在当前的服务器版本里,始终无法找到对应的DTC的错误日志,怀疑应该是版本或者权限的问题,问过运维,这个版本很多地方都在用,只是大家都没用DTC服务。

2、为什么本地执行的时间反而比服务器上的时间更短呢?之前没有考虑索引,也是因为在本地PC环境里,这个事务只需要5分钟左右,配置差,为啥反而比服务器上更快呢?考虑可能是DTC在server和win7系统中的设置不同,但是具体是哪里的差异呢?

由于还有其他工作要处理,这两个未解之谜就留待将来有机会再解决,有碰到过的朋友,欢迎留言讨论,这个算不算工匠精神?

猜你喜欢

转载自blog.csdn.net/hehuii/article/details/130971301