一、如何跟踪死锁
跟踪方法见: http://guobaoguo.blog.163.com/blog/static/109162582010112311553185/
我选择的是第二种,然后获取了一份儿跟踪文件。
1、SQL Server Profiler的图形展示
2、提取的xml数据
二、死锁的牺牲者 victim="process98274c8"
三、看process、resource节点
process:
1、process98274c8——报表查询
2、process9862748——跨3机器,dtc分布式事务,耗时较长
resource:
1、用到的资源:表=FA_Voucher, 索引 =PK_FA_Voucher,
process9862748做插入操作, 加排他X锁,
process98274c8 申请RangeS-S锁,请求类型 wait
2、用到的资源:表=YW_CwDistributionInfo,
process98274c8做查询,加共享S锁,
process9862748 申请SIX锁,请求类型 convert,此处对convert不是太理解
3、根据锁兼容模式表来看以上两种都是冲突的,也是死锁
https://msdn.microsoft.com/zh-cn/library/jj856598(v=sql.120).aspx
四、解决办法
1、报表查询添加 with(nolock),非实时性,允许脏读。
2、后期看跟踪情况,可能的话拆分分布式事务,改用消息模式