我们有什么方法可以只锁定表的单行(IN SQL SERVER 2008)
我正在尝试这样的事情
BEGIN TRAN
select TOP 1 from [TableName] with (ROWLOCK,UPDLOCK)
COMMIT
但似乎SQL服务器忽略了ROWLOCK并在页面上获取了IU锁定而在桌面上获得了IX。
我们将不胜感激您的帮助:)
答案 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