我有一个表更新,而在where子句中没有索引,所以我在更新脚本中使用ROWLOCK,希望获得行锁而不是表锁但没有运气..那么ROWLOCK的功能是什么呢?我在select语句中使用它但仍然锁定整个表...太烦人了!
答案 0 :(得分:4)
如果选择的行太多 - Sql Server会将锁升级到表级。相反,你可能会达到可能的锁定计数或内存的上限
或强>
您使用SNAPSHOT
隔离级别 - 然后您只能同时应用ROWLOCK
提示HOLDLOCK
或UPDLOCK
提示
<强>更新强>
您可以使用
构建语句DBCC TRACEON(-1,3604,1200) WITH NO_INFOMSGS;
Here is your statement
DBCC TRACEOFF(-1,3604,1200) WITH NO_INFOMSGS;
并查看 - 在运行期间采取,保持和释放哪些锁
<强>已更新强>:
DBCC TRACEON(-1,3604,1200)
BEGIN TRAN
更新[订单]
with(ROWLOCK)
SET ProductId = 3
WHERE CustomerId = 1
DBCC执行完成。如果DBCC打印了错误消息,请与系统管理员联系。
进程54获取对象上的IX锁定:16:229575856:0(类bit2000000 ref1)结果:确定
进程54在PAGE上获取IU锁定:16:1:196(类bit0 ref1)结果:OK
进程54获取RID上的U锁:16:1:196:0(类bit0 ref1)结果:OK
进程54在PAGE上获取IX锁:16:1:196(类bit2000000 ref0)结果:OK
进程54获取RID上的X锁定:16:1:196:0(类bit2000000 ref0)结果:OK
进程54在RID上释放锁定引用:16:1:196:0
进程54获取RID上的U锁:16:1:196:1(类bit0 ref1)结果:OK
进程54释放对RID的锁定:16:1:196:1
进程54在PAGE:16:1:196
上释放锁定引用(1行受影响)