在SQL Server中的ROWLOCK

时间:2012-01-18 06:07:02

标签: sql-server-2008

我有一个表更新,而在where子句中没有索引,所以我在更新脚本中使用ROWLOCK,希望获得行锁而不是表锁但没有运气..那么ROWLOCK的功能是什么呢?我在select语句中使用它但仍然锁定整个表...太烦人了!

1 个答案:

答案 0 :(得分:4)

如果选择的行太多 - Sql Server会将锁升级到表级。相反,你可能会达到可能的锁定计数或内存的上限

您使用SNAPSHOT隔离级别 - 然后您只能同时应用ROWLOCK提示HOLDLOCKUPDLOCK提示

<强>更新

您可以使用

构建语句
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行受影响)