如果我在MS SQL Server中选择一行进行更新,并希望在更新或取消之前将其锁定,哪个选项更好:
1)使用UPDLOCK等查询提示 2)为事务使用REPEATABLE READ隔离级别 3)其他任何选项。
谢谢, Chak.
1)使用UPDLOCK等查询提示 2)为事务使用REPEATABLE READ隔离级别 3)其他任何选项。
谢谢, Chak.
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仅锁定此行,而不是发出页面或表锁定。不需要。当用户输入数据时,你几乎从不想保持事务处于开启状态。如果你确实必须像这样实现悲观锁,人们通常会通过自己编写功能来实现。
请仔细考虑你所做的事情的全部后果。我曾经在一个实现了这种锁定的系统上工作过。你经常会遇到大量过时的锁定,并且当你把这个东西强加给用户时,他们会很快感到困惑和愤怒。在我们的情况下,解决方案是完全删除此锁定功能。
请注意,尽管使用ROWLOCK,SQL Server仍可能选择在必要时采取完整页面锁定。