首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >T-SQL中的悲观锁

T-SQL中的悲观锁
EN

Stack Overflow用户
提问于 2008-12-22 12:34:23
回答 3查看 7.2K关注 0票数 5

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

1)使用类似UPDLOCK的查询提示2)对事务使用可重复的读隔离级别3)任何其他选项。

谢谢,Chak。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2008-12-22 12:39:36

都不是。当用户输入数据时,您几乎不想让事务保持打开状态。如果你必须像这样实现一个悲观的锁,人们通常会通过滚动自己的功能来实现。

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

票数 3
EN

Stack Overflow用户

发布于 2008-12-22 14:00:47

如果你正在等待另一个资源,比如终端用户,那就采纳Dave Markle的建议,不要去做。

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

代码语言:javascript
复制
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

SQL 提示礼貌地要求SQL Server在您提交事务之前持有该锁。ROWLOCK提示礼貌地要求SQL Server仅锁定此行,而不是发出页锁或表锁。

请注意,如果有许多行受到影响,SQL Server将主动升级为页锁,或者会有一大堆行锁填满服务器的内存并使处理陷入停滞。

票数 8
EN

Stack Overflow用户

发布于 2008-12-22 14:02:53

只需注意,尽管使用了行锁,但如果SQL Server认为需要,它可能会选择仍然采用全页锁。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/386162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档