场景:
1、.net EF框架程序
2、连接SQLServer数据库,并且使用链接服务器进行数据查询
问题:
1、偶发报错 无法执行该操作,因为链接服务器“XXX"的 OLE DB 访问接口“SQLNCLI11”无法启动分布式事务。
分析:
首先确认一点,对应脚本没有开启事务,只是做查询,没有开启分布式事务一说。那为什么会报这个错误,百思不得其姐。很奇怪。照例,网上搜了一番,无一例外都是有关分布式事务的相关设置,大同小异,由于是生产环境,不能尝试去设置修改。
后面再仔细想想,如何复现报错,是解决问题的关键,复现了问题,才好确定其根因。
本着这个目的,就来开始猜想其原因和找到复现的方式,那就要分析问题的特点:
该问题只是偶尔会出现,并不是每次都出现。
没有开事务却报无法启动分布式事务,而且并不是每次调用都会出现。
感觉这个问题非常奇怪,但结合这两点,去猜想其原因和尝试复现,突然想到了之前找到的EF框架修改数据时会采用SERIALIZABLE事务隔离级别,其特点符合这两点,与事务有关,并且该隔离级别的连接池会被其他会话使用,存在偶发性特点。
测试:
立马尝试,果然复现。

结论:
没想到序列化的事务隔离级别对链接服务器使用也存在影响。序列化的事务隔离级别平时比较少关注和几乎没有应用会使用,所以给我们带来的迷惑问题也不少。
2133

被折叠的 条评论
为什么被折叠?



