T-SQL中的悲观锁定

5 sql-server locking transactions pessimistic

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

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

谢谢,泽.

Roa*_*ior 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
Run Code Online (Sandbox Code Playgroud)

HOLDLOCK提示礼貌询问的SQL Server,直到您提交事务持有的锁.该ROWLOCK提示礼貌地要求的SQL Server只锁定该行,而不是发出页或表锁.

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


Dav*_*kle 3

两者都不。您几乎不想在用户输入数据时保持事务打开。如果必须实现这样的悲观锁,人们通常会通过滚动自己的功能来实现。

考虑一下你正在做的事情的全部后果。我曾经开发过一个像这样实现锁定的系统。您经常会遇到大量陈旧的锁,当您将其强加给用户时,他们很快就会感到困惑和愤怒。在我们的案例中,我们的解决方案是完全删除此锁定功能。