首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >更新锁如何防止常见形式的死锁?

更新锁如何防止常见形式的死锁?
EN

Stack Overflow用户
提问于 2014-03-12 13:39:43
回答 2查看 3.1K关注 0票数 8

Server联机丛书UPDATE锁可以防止一种常见的死锁形式:

更新锁 Update (U)锁防止常见的死锁形式。

它们如何防止一种常见的僵局?

我这么说是什么意思?

一种常见的死锁形式是两个进程试图从共享(S)锁(即读锁)升级到独占(X)锁时:

代码语言:javascript
运行
复制
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)锁。但无论如何,让我们试着解决这个问题:

首先,我们假设的是一个正常的更新过程:

  • 获取共享(S)锁
  • 试图升级到更新(U)锁
  • 执行更新
  • 需要改变价值,升级为独占(X)锁
  • 升级为排他(X)锁
  • 执行更新
  • 释放所有锁

所以现在添加第二个进程

代码语言:javascript
运行
复制
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)锁如何防止常见形式的死锁?

EN

回答 2

Stack Overflow用户

发布于 2014-03-12 14:07:19

描述不完整。如果您查看短语“一次只有一个事务可以获得对资源的更新(U)锁”。这与独占(X)锁没有什么不同--只有一个事务可以在同一时间获得对资源的排他(X)锁。

U锁与S锁兼容,而X锁则不是这种情况.这意味着,当要写入的行被确定时(使用U锁),其他读取器仍然被允许。

现在再加上第二个过程..。

这里的误解是,作家从S升级到美国--事实并非如此。他们从一开始就使用U。他们后来从U升级到X,但在这种情况下,这对死锁没有任何意义。

为了更清楚地说明这一点:让我们假设我们运行以下语句:

代码语言:javascript
运行
复制
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锁将提前发布。

票数 7
EN

Stack Overflow用户

发布于 2014-03-12 14:10:01

update锁用于查找要更新的行,DELETE和UPDATE语句也是如此。一旦为Update找到行,则锁将转换为X锁。

请参阅Kalen Delany博客

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

https://stackoverflow.com/questions/22353327

复制
相关文章

相似问题

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