Server联机丛书说UPDATE锁可以防止一种常见的死锁形式:
更新锁 Update (U)锁防止常见的死锁形式。
它们如何防止一种常见的僵局?
我这么说是什么意思?
一种常见的死锁形式是两个进程试图从共享(S)锁(即读锁)升级到独占(X)锁时:
Process A Process B
======================== ========================
Acquire Shared lock
Acquire Shared lock
Attempt to escalate to X
Escalation waits on B
Attempt to escalate to X
Escalation waits on A死锁.这两个进程都在等待对方。
这一点在“巴塞尔公约”中作了解释:
典型的更新模式包括读取记录的事务,获取资源(页或行)上的共享(S)锁,然后修改行,这需要将锁转换为独占(X)锁。如果两个事务获取资源上的共享模式锁,然后尝试并发更新数据,则有一个事务尝试将锁转换为独占(X)锁。共享模式到独占锁转换必须等待,因为一个事务的独占锁与另一个事务的共享模式锁不兼容;出现锁等待。第二个事务试图获取用于更新的独占(X)锁。因为两个事务都在转换为独占(X)锁,而且它们都在等待另一个事务释放其共享模式锁,因此会出现死锁。
使用更新锁来防止死锁。
联机丛书没有解释update (U)锁如何防止这种常见的死锁形式,他们只说:
为了避免这个潜在的死锁问题,使用update (U)锁。一次只有一个事务可以获得资源的update (U)锁。如果事务修改了资源,则update (U)锁将转换为独占(X)锁。否则,锁将转换为共享模式锁.
描述不完整。如果您查看短语“一次只有一个事务可以获得对资源的更新(U)锁”。这与独占(X)锁没有什么不同--只有一个事务可以在同一时间获得对资源的排他(X)锁。但无论如何,让我们试着解决这个问题:
首先,我们假设的是一个正常的更新过程:
所以现在添加第二个进程
Process A Process B
======================== ========================
Acquire Shared lock
Acquire Shared lock
Attempt to escalate to U
Escalation waits on B
Attempt to escalate to U
Escalation waits on A死锁.这两个进程都在等待对方。
更新(U)锁如何防止常见形式的死锁?
发布于 2014-03-12 14:07:19
描述不完整。如果您查看短语“一次只有一个事务可以获得对资源的更新(U)锁”。这与独占(X)锁没有什么不同--只有一个事务可以在同一时间获得对资源的排他(X)锁。
U锁与S锁兼容,而X锁则不是这种情况.这意味着,当要写入的行被确定时(使用U锁),其他读取器仍然被允许。
现在再加上第二个过程..。
这里的误解是,作家从S升级到美国--事实并非如此。他们从一开始就使用U。他们后来从U升级到X,但在这种情况下,这对死锁没有任何意义。
为了更清楚地说明这一点:让我们假设我们运行以下语句:
UPDATE T SET SomeCol = 1 WHERE (ID BETWEEN 1 AND 2) AND (SomeOtherCond = 1)假设这是通过对ID上的聚集索引进行范围扫描来执行的,并且SomeOtherCond = 1仅适用于行ID = 2。这将为两行提供U锁,并为带有ID = 2的行升级到X。行ID = 2的U锁将提前发布。
发布于 2014-03-12 14:10:01
update锁用于查找要更新的行,DELETE和UPDATE语句也是如此。一旦为Update找到行,则锁将转换为X锁。
请参阅Kalen Delany博客
https://stackoverflow.com/questions/22353327
复制相似问题