如何仅为更新锁定单行

时间:2013-11-13 08:17:30

标签: sql sql-server

我们有什么方法可以只锁定表的单行(IN SQL SERVER 2008)

我正在尝试这样的事情

BEGIN TRAN

select TOP 1 from [TableName] with (ROWLOCK,UPDLOCK)

COMMIT

但似乎SQL服务器忽略了ROWLOCK并在页面上获取了IU锁定而在桌面上获得了IX。

我们将不胜感激您的帮助:)

3 个答案:

答案 0 :(得分:3)

update Production.Location with (ROWLOCK)
   set CostRate = 100.00
 where LocationID = 1  

如果要更新记录,请使用rowlock。

答案 1 :(得分:2)

select TOP 1 from [TableName] with (ROWLOCK)

答案 2 :(得分:1)

使用UPDLOCK提示,您正在请求UPDATE锁定,这就是您的SELECT卡在等待上一个事务完成的原因。 你应该指定HOLDLOCK而不是UPDLOCK:

select TOP 1 * from t1 with (ROWLOCK, HOLDLOCK)

这将保留共享锁并让其他事务选择数据,但不更新它:如果另一个会话尝试更新使用此共享锁锁定的行,则必须等待您释放锁(结束您的交易)

您可以使用此查询查看锁定:

SELECT request_session_id ,
    resource_type ,
    DB_NAME(resource_database_id) AS DatabaseName ,
    OBJECT_NAME(resource_associated_entity_id) AS TableName ,
    request_mode ,
    request_type ,
    request_status
FROM sys.dm_tran_locks AS L
JOIN sys.all_objects AS A ON L.resource_associated_entity_id = A.object_id