首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >关于DBMS锁定的说明

关于DBMS锁定的说明
EN

Stack Overflow用户
提问于 2009-09-30 16:59:05
回答 5查看 997关注 0票数 2

我正在上一门关于数据库管理系统的入门课程,我有一个我的书没有回答的问题。这个问题不是来自我的家庭作业,我只是好奇。

教科书不断强调,事务是一个逻辑工作单元。然而,当遇到共享/独占锁定模式时,我有点困惑。

书中有一个图表,看起来是这样的:

时间|交易状态

1个版本的请求锁。

2个人,一个人,一个人,收到锁。

3%交易流程交易。

4个月,一个月,一个月。

5*锁发布

事务是同时处理所有事务,还是在获得单个锁时进行处理?

如果在两个事务中有导致共享锁和排他锁的命令,那么这些事务是并发运行还是一个接一个地调度?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-09-30 17:26:45

像往常一样,答案是“视情况而定”:-)

一般来说,您不需要在开始之前取出所有锁;但是,在释放任何锁之前,您需要取出所有锁。因此,您可以执行以下操作:

代码语言:javascript
运行
复制
lock resource A
update A
lock resource B
update B
unlock A
unlock B

例如,这允许您对可能想要读取B的其他事务更友好一些,而不关心A。它确实引入了更多风险--您可能无法获得B上的锁,并决定回滚您的事务。这就是突破口。

您还希望始终以相同的顺序获取所有锁,这样就不会陷入死锁(事务1有A,想要B;事务2有B,想要A;正午僵持,没有人赢。如果强制执行一致的顺序,trans2将尝试在B之前获取A,然后等待,让trans2继续,或者失败,如果trans1已经启动--无论哪种方式,都没有死锁)。

当您有意图排除锁时,事情就会变得更有趣了。意图排除锁是指通过“选项”使其成为独占的共享锁。这可能会在你的书的后面的某个地方被介绍:-)

票数 1
EN

Stack Overflow用户

发布于 2009-09-30 17:18:43

在实践中,每个操作在继续之前都会获得所需的锁。SELECT将首先获取一行上的共享锁,然后读取该行。UPDATE将首先获取该行上的排它锁,然后更新该行。从理论上讲,你可以说“锁是获得的,然后是事务处理”,但在现实生活中,正是事务中的每个单独操作知道需要什么锁。

票数 1
EN

Stack Overflow用户

发布于 2009-09-30 17:07:43

如果它需要一个排它锁,它将阻塞另一个事务,或者在获得锁之前等待另一个事务完成。

需要排它锁的事情(更新/删除等)不会在任何其他对象访问数据时发生。

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

https://stackoverflow.com/questions/1499416

复制
相关文章

相似问题

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