目录
今天是2021年第一个工作日,没想到就碰到了诡异问题:系统的不同用户执行同一个事务操作,结果有的可以,有的不可以!但本地测试,都是可以的!
于是,首先重启了服务器上所有的相关服务,然后问题依旧。
问题出现
经过查询后台日志,发现有如下报错:
分布式事务处理协调器(MS DTC)已取消此分布式事务
经过百度,发现都是说如何配置DTC角色和权限的,根据问题现象,感觉不是角色和权限的问题。
结合之前的反馈,发现这个用户对应的帐套在执行这个事务的时候,由于数据比较大,所以每次执行时间都很长,那么会不会是超时引起的呢?
原因分析
于是,赶紧查了一下系统配置config文件,发现其中有如下配置:
<system.transactions>
<defaultSettings timeout="00:10:00"/>
</system.transactions>
10分钟,不短的。但是经过测试,发现此用户从执行到执行结束,基本上都是5分钟左右后台就报错了!
再查代码,终于发现问题原因!
this.transactionScope = new TransactionScope(TransactionScopeOption.Required,new TimeSpan(0, 5, 0));
原来,代码里也配置了超时时间,经过学习,这里的超时时间是优先于config文件的!难怪每次到5分钟的时候,后台就报错了!
解决方案
为了避免今后再出现歧义,也避免重复修改代码,最终采取了如下代码,这样在创建分布式事务的时候,会自动到config文件里去读取超时间,代码如下:
this.transactionScope = new TransactionScope(TransactionScopeOption.Required);//超时取config文件
反思上述过程,有一个疑问还没有解决:
之前在本地测试的时候,并没有出现上面的问题,而且感觉执行速度也比在服务器上的快很多,估计是服务器的生产环境对于事务的处理耗时更久。大家碰到过类似问题吗?