【发布时间】:2015-03-31 03:10:15
【问题描述】:
我在短时间内多次遇到死锁问题synchronizing 一张表。同步是指执行以下操作:
- 将要同步的数据插入到临时表中
- 更新目标表中的现有记录
- 将新记录插入到目标表中
- 删除某些条件下不在同步表中的记录 情况
- 删除临时表
对于INSERT 和DELETE 语句,我使用了类似于:
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。
【问题讨论】:
-
这一切都是在一个事务中完成的吗?您使用的是什么事务隔离级别?是否有其他活动使用目标表?
标签: sql-server tsql sql-server-2005 deadlock