gpt4 book ai didi

SELECT 和 UPDATE 之间的 SQL 数据库锁定差异

转载 作者:搜寻专家 更新时间:2023-10-30 21:55:59 24 4
gpt4 key购买 nike

我正在重写一个由 BizTalk 调用的旧存储过程。现在这有可能一次推送 50-60 条消息。当他们都试图同时更新时,我偶尔会遇到数据库锁定问题。我只能在 SQL(不是 BizTalk)中进行更改,并且我正在尝试找到运行我的 SP 的最佳方式。考虑到这一点,我所做的是使大部分语句通过使用 SELECT 语句来确定是否需要更新。

我的问题是 - UPDATE 语句和针对它的 NOLOCK 的 SELECT 之间的锁定有什么区别?

我希望这是有道理的 - 谢谢。

最佳答案

当您想读取未提交的数据并希望避免对数据采取任何共享锁以便其他事务可以采取独占时,您可以使用nolock code> 用于更新/删除的锁。

你不应该将 nolockupdate 语句一起使用,这确实是一个坏主意,MS 说 nolock 被忽略的目标更新/插入语句。

Support for use of the READUNCOMMITTED and NOLOCK hints in the FROM clause that apply to the target table of an UPDATE or DELETE statement will be removed in a future version of SQL Server. Avoid using these hints in this context in new development work, and plan to modify applications that currently use them. Source

关于同时发生多个更新期间的锁定问题。这通常发生在您读取数据并打算稍后通过仅放置共享锁来更新它时,以下 UPDATE 语句无法获取必要的更新锁,因为它们已经被在不同 session 中获取的共享锁阻塞,导致死锁。

要解决此问题,您可以使用 UPDLOCK 选择记录,如下所示

DECLARE @IdToUpdate INT
SELECT @IdToUpdate =ID FROM [Your_Table] WITH (UPDLOCK) WHERE A=B

UPDATE [Your_Table]
SET X=Y
WHERE ID=@IdToUpdate

这将提前在记录上获取必要的更新锁,并停止其他 session 获取记录上的任何锁(共享/独占),并防止任何死锁。

关于SELECT 和 UPDATE 之间的 SQL 数据库锁定差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50386632/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com