如果我在MS SQL Server中选择要更新的行,并希望将其锁定直到我更新或取消,哪个选项更好: -
1)使用像UPDLOCK这样的查询提示 2)对事务使用REPEATABLE READ隔离级别 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可能会选择在需要时仍然采用整页锁定。