这两天发布服务器SQL Server日志中总报出现死锁,
第一步:问题信息如下
Replication-Replication Distribution Subsystem: agent xxxxxxxxxxxxxxxxx scheduled for retry. Transaction (Process ID XX) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
第二步:尝试在发布服务器上开启跟踪标志1204
DBCC TRACEON(1204,-1)
报告出现死锁的信息不断出现,但跟踪标志1204应该返回的死锁资源信息并没有记录到日志中。难道跟踪标志对复制产生的死锁不起作用?
后来到订阅服务器上检查了一下订阅代理执行记录,发现死锁信息是订阅代理作业产生的,那么就是说在发布服务器上启用跟踪标志1204本身就是不对的?
于是在订阅服务器上启用跟踪标志1204,这次死锁资源信息被记录下来了。
比较费解的是引起死锁的资源是创建订阅时系统生成的存储过程sp_MSupd_TableA 和sp_MSupd_TableB,这是更新两个不同表的存储过程,怎么会发生死锁呢?
思索了一阵,突然想到,会不会是两个表之间进行了某种关联呢?最常见的应该就是索引视图了。检查了一下数据库中的视图,发现果然有一个索引视图的基表是TableA和TableB。这就不奇怪了,索引视图连接了2个表,两个事务同时去更新,出现死锁的可能性就很大了。问了一下别的同事,原来是为了方便使用创建了索引视图。由于视图上的索引可有可无,于是删除掉视图上的索引,问题解决……