0

我正在使用 readcommited 隔离级别来更新一个事务中的一行。从其他事务中,我应该如何找到在同一行上放置的锁而不尝试更新该行。任何想法?

4

3 回答 3

2

检查锁的唯一方法是自己获取锁。这不是特定于数据库的,是并发的一般问题。任何形式的“检查”是否持有锁的 API 基本上都被破坏了,因为根据定义,基于此 API 检查结果执行的任何操作都是错误的,基本的陈旧过时的信息也是如此。知道在 API 检查时未持有锁并不意味着在 API 返回时未持有。

如果你查询锁,你不可能写出正确的程序。编写正确程序的唯一方法是获取锁。与任何其他编程语言一样,在 SQL 中是正确的。

没有什么能阻止您尝试通过即时超时 ( SET LOCK_TIMEOUT 0) 获取锁并处理发生冲突时发生的锁超时错误。

于 2012-07-13T05:25:06.207 回答
1

要获取有关锁的信息,您可以执行 sp_lock过程。

注意: VIEW SERVER STATE需要许可。

在 SQL Server 2008 中,您可以使用sys.dm_tran_locks动态管理视图。

于 2012-07-13T05:06:40.900 回答
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
于 2012-07-13T05:41:10.950 回答