T-SQL中的悲观锁定

时间:2008-12-22 12:34:23

标签: sql-server locking transactions pessimistic

如果我在MS SQL Server中选择要更新的行,并希望将其锁定直到我更新或取消,哪个选项更好: -

1)使用像UPDLOCK这样的查询提示 2)对事务使用REPEATABLE READ隔离级别 3)任何其他选择。

谢谢, 泽。

3 个答案:

答案 0 :(得分:8)

如果您正在等待最终用户等其他资源,请接受Dave Markle的建议而不要这样做。

否则,请尝试以下T-SQL代码:

BEGIN TRAN

SELECT *
FROM   authors AU
WITH   (HOLDLOCK, ROWLOCK)
WHERE  AU.au_id = '274-80-9391'

/* Do all your stuff here while the row is locked */

COMMIT TRAN

HOLDLOCK 提示礼貌地要求SQL Server保持锁定,直到您提交事务为止。 ROWLOCK 提示礼貌地要求SQL Server仅锁定此行而不是发出页面或表锁。

请注意,如果有大量行受到影响,SQL Server将主动升级为页锁,或者您将拥有一大堆行锁来填充服务器的内存并阻碍处理。

答案 1 :(得分:3)

都不是。在用户输入数据时,您几乎不希望保持事务处于打开状态。如果您 实现这样的悲观锁定,人们通常会通过滚动自己的功能来实现。

考虑你正在做的事情的全部后果。我曾经在一个像这样实现锁定的系统上工作过。你经常会遇到大量陈旧的锁,当你把它们强加给你时,你的用户会很快感到困惑和生气。在我们的案例中,我们的解决方案是完全删除此锁定功能。

答案 2 :(得分:0)

请注意,尽管使用了ROWLOCK,但SQL Server可能会选择在需要时仍然采用整页锁定。