我在短时间内多次遇到死锁问题synchronizing
表。通过同步我的意思是做了以下内容:如何重构这个死锁问题?
- 插入数据被同步到一个临时表
- 更新的目标表中已有的记录
- 新记录插入到目标表
- 删除不记录在某些特定 情况下,同步表
- 删除临时表
对于INSERT
和DELETE
声明,我使用的是LEFT JOIN类似:
INSERT INTO destination_table (fk1, fk2, val1)
FROM #tmp
LEFT JOIN destination_table dt ON dt.fk1 = #tmp.fk1
AND dt.fk2 = #temp.fk2
WHERE dt.pk IS NULL;
死锁图表报告destination_table的主键是下一个排它锁。我假设上述查询导致表或页锁而不是行锁。我如何确认?
我可以用IN
,EXIST
或EXCEPT
命令重写上述查询。是否有任何其他重构代码的方法?使用任何这些命令重构会避免死锁问题?哪一个会是最好的?我假设EXCEPT
。
这是否都是在交易中完成的?您使用的是什么事务隔离级别?是否有使用目的地表的其他活动? – HABO 2015-01-31 21:13:49