T-SQL中的悲观锁

5
如果我在MS SQL Server中选择一行进行更新,并希望在更新或取消之前将其锁定,哪个选项更好:
1)使用UPDLOCK等查询提示 2)为事务使用REPEATABLE READ隔离级别 3)其他任何选项。
谢谢, Chak.
3个回答

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将采取主动措施并升级为页面锁定,否则您将拥有一整个行锁定军队填满服务器的内存并阻塞处理。

3

不需要。当用户输入数据时,你几乎从不想保持事务处于开启状态。如果你确实必须像这样实现悲观锁,人们通常会通过自己编写功能来实现。

请仔细考虑你所做的事情的全部后果。我曾经在一个实现了这种锁定的系统上工作过。你经常会遇到大量过时的锁定,并且当你把这个东西强加给用户时,他们会很快感到困惑和愤怒。在我们的情况下,解决方案是完全删除此锁定功能。


1
请注意,该帖子作者的情况可能与最终用户输入数据无关。 - HTTP 410

0

请注意,尽管使用ROWLOCK,SQL Server仍可能选择在必要时采取完整页面锁定。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接