我使用readcommited隔离级别来更新一个事务中的行。从其他事务中,如何在不尝试更新行的情况下找到放置在同一行上的锁。 有什么想法吗?
答案 0 :(得分:2)
检查锁定的唯一方法是获得锁定自己。这不是特定于数据库,是并发的一般问题。任何形式的“检查”是否存在锁定的API都会从根本上被破坏,因为根据定义,基于此API检查结果执行的任何操作都是错误的,因为基础过时,过时的信息。知道在API检查时没有保留锁 并不意味着API返回时不会保留。
如果询问有关锁定,则无法编写正确的程序。编写正确程序的唯一方法是获取锁。在SQL中为True,就像在任何其他编程语言中一样。
没有什么可以阻止您尝试使用即时超时(SET LOCK_TIMEOUT 0
)获取锁定并处理冲突时发生的锁定超时错误。
答案 1 :(得分:1)
要获取有关锁定的信息,您可以执行sp_lock
过程。
注意:需要VIEW SERVER STATE
权限。
在SQL Server 2008中,您可以使用sys.dm_tran_locks动态管理视图。
答案 2 :(得分:1)
我认为您可以在表级找到锁而不是在行级
尝试下面的代码,它会给出当前锁定的表。
SELECT t.name as [Table Name]
FROM sys.dm_tran_locks as t1
Join sys.objects o1 on o1.object_id = t1.resource_associated_entity_id
Join sys.tables t on o1.object_id = t.object_id