如果我的查询如下所示:
DELETE a
FROM TableA AS a
JOIN TableB as b
ON a.SomeColumn = b.SomeColumn
TableB
是否在从 中删除所有记录的持续时间内被锁定TableA
?如果是,是表级、页级还是行级锁定?
我正在使用 SQL Server 2008 R2,我很难找到关于 SQL Server 何时以及如何使用一般锁定的良好信息,因此任何与此相关的资源将不胜感激。
如果我的查询如下所示:
DELETE a
FROM TableA AS a
JOIN TableB as b
ON a.SomeColumn = b.SomeColumn
TableB
是否在从 中删除所有记录的持续时间内被锁定TableA
?如果是,是表级、页级还是行级锁定?
我正在使用 SQL Server 2008 R2,我很难找到关于 SQL Server 何时以及如何使用一般锁定的良好信息,因此任何与此相关的资源将不胜感激。
最有可能的是,共享锁将发布给TableB
,与您运行SELECT
. 但是,所采用的特定类型的锁定以及锁定的持续时间将根据您的个人情况而有所不同,因此您应该执行以下验证以获得您问题的准确答案:
首先,SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
。这将导致共享锁在事务完成之前被持有,而不是像在READ COMMITTED
.
我们正在提高隔离级别,以便我们可以检查稍后发布了哪些锁……但正因为如此,您可能不想在生产系统上进行此测试。
接下来,BEGIN TRANSACTION
。
然后,发出有问题的DELETE
命令。
现在,检查sys.dm_tran_locks
. 我强烈建议SELECT
在这个答案中使用@Martin Smith 提供的声明。
最后COMMIT
还是ROLLBACK
要关闭事务并释放锁。
使用的结果将为您提供有关所SELECT
采用sys.dm_tran_locks
的锁类型以及所采用的对象的详细信息。