如何在不更新记录的情况下了解行的锁定状态

时间:2012-07-13 04:51:42

标签: c# sql-server sql-server-2008 transactions locking

我使用readcommited隔离级别来更新一个事务中的行。从其他事务中,如何在不尝试更新行的情况下找到放置在同一行上的锁。 有什么想法吗?

3 个答案:

答案 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