How to know the lock status for a row, without updating the record

旧街凉风 提交于 2019-12-13 04:36:33

问题


I am using the readcommited isolation level to update a row in one transaction. From other transaction, How should I find there is a lock placed on the same row without trying to update the row. Any idea?


回答1:


The only way to check for a lock is by obtaining the lock your self. This is not specific to databases, is a general issue with concurrency. Any form of API that 'checks' if a lock is held or not is fundamentally broken because by definition any action performed based on the result of this API check is wrong, as is base don stale, obsolete information. Knowing that lock was not held when the API checked for it does not mean is not held by the time the API returned.

You cannot possibly write a correct program if you inquire about locks. the only way to write a correct program is to acquire locks. True in SQL as in any other programming language.

Nothing stops you from attempting to acquire a lock with instant timeout (SET LOCK_TIMEOUT 0) and handle the lock timeout error that occurs on conflict.




回答2:


To get the information about lock, you can execute sp_lock procedure.

NOTE: VIEW SERVER STATE permission is required.

In SQL Server 2008, you can use sys.dm_tran_locks dynamic management view.




回答3:


I think you can find the lock on table level not on row level

try below code it will give the table which is currently lock.

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


来源:https://stackoverflow.com/questions/11464317/how-to-know-the-lock-status-for-a-row-without-updating-the-record

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!