gpt4 book ai didi

sql-server - 更新锁的用途

转载 作者:行者123 更新时间:2023-12-05 01:21:06 26 4
gpt4 key购买 nike

我正在阅读 Understanding Locking in SQL Server .但是我不太明白更新锁的用途。

详细说明如下:

Update Locks

Update (U) locks prevent a common form of deadlock. A typical update pattern consists of a transaction reading a record, acquiring a shared (S) lock on the resource (page or row), and then modifying the row, which requires lock conversion to an exclusive (X) lock. If two transactions acquire shared-mode locks on a resource and then attempt to update data concurrently, one transaction attempts the lock conversion to an exclusive (X) lock. The shared-mode-to-exclusive lock conversion must wait because the exclusive lock for one transaction is not compatible with the shared-mode lock of the other transaction; a lock wait occurs. The second transaction attempts to acquire an exclusive (X) lock for its update. Because both transactions are converting to exclusive (X) locks, and they are each waiting for the other transaction to release its shared-mode lock, a deadlock occurs.

To avoid this potential deadlock problem, update (U) locks are used. Only one transaction can obtain an update (U) lock to a resource at a time. If a transaction modifies a resource, the update (U) lock is converted to an exclusive (X) lock. Otherwise, the lock is converted to a shared-mode lock.

考虑以下两个事务(两个事务都在 Isolation Level Repeatable Read 执行,以便在事务期间保持 S 锁):

在 TRAN1 中执行以下 SQL。

BEGIN TRAN
SELECT BrandName FROM dbo.Brand WHERE BrandId=2

现在,TRAN1 为 RID 授予 S 锁

在 TRAN2 中执行以下 SQL

 BEGIN TRAN
SELECT BrandName FROM dbo.Brand WHERE BrandId=2

现在,TRAN2 为与 TRAN1 相同的 RID 资源授予 S 锁

在 TRAN1 中执行以下 SQL

UPDATE dbo.Brand SET BrandName='YBrand' WHERE BrandId=2

此时,TRAN1 S锁转U锁,U锁等待TRAN2 S锁释放转X锁

在 TRAN2 中执行以下 SQL

UPDATE dbo.Brand SET BrandName='ZBrand' WHERE BrandId=2

然后发生死锁。

Up deadlock 和U lock用来防止死锁的描述完全一样。但是还是会出现死锁。

所以我的问题是:U锁和X锁有什么不同?哪些情况下可以避免使用X锁来防止死锁?

最佳答案

UPDATE 操作分为两步:

  1. 首先使用(U)(更新)锁读取现有值

  2. 然后该锁被转换为独占 (X) 锁以写回新的(更新的)值。

因为您的REPEATABLE READ 隔离级别,并且因为您已经这样安排您的语句,是的,您将遇到死锁。但我真的不明白这与 update 锁有什么关系......(这真的只是因为你已经这样安排了你的代码并且因为你正在使用 REPEATABLE READ )。

(U) 锁的主要“好处”是其他(S) 共享锁在那段时间内仍然是可能的。例如。当一个事务读取要使用 (U) 锁更新的值时,另一个事务可以使用 (S) 共享锁在 SELECT 中读取相同的值(如果你有独占的 (X) 锁,这不起作用,例如,当你执行 DELETE 时)

如果您有两个事务都只执行 UPDATE(没有 SELECTREPEATABLE READ)- 那么 ( U) 第一个事务获取的锁将阻止第二个事务也读取该值(因为 (U) 锁不兼容 - 如果 TRAN1 有行上的更新锁,TRAN2 无法获取它的更新锁)。这使得“读取现有值、更新它、将其写回”成为一个原子操作,并防止两个事务同时在同一行上启动更新过程。

关于sql-server - 更新锁的用途,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24094663/

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