我正在上一门关于数据库管理系统的入门课程,我有一个我的书没有回答的问题。这个问题不是来自我的家庭作业,我只是好奇。
教科书不断强调,事务是一个逻辑工作单元。然而,当遇到共享/独占锁定模式时,我有点困惑。
书中有一个图表,看起来是这样的:
时间|交易状态
1个版本的请求锁。
2个人,一个人,一个人,收到锁。
3%交易流程交易。
4个月,一个月,一个月。
5*锁发布
事务是同时处理所有事务,还是在获得单个锁时进行处理?
如果在两个事务中有导致共享锁和排他锁的命令,那么这些事务是并发运行还是一个接一个地调度?
发布于 2009-09-30 17:26:45
像往常一样,答案是“视情况而定”:-)
一般来说,您不需要在开始之前取出所有锁;但是,在释放任何锁之前,您需要取出所有锁。因此,您可以执行以下操作:
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已经启动--无论哪种方式,都没有死锁)。
当您有意图排除锁时,事情就会变得更有趣了。意图排除锁是指通过“选项”使其成为独占的共享锁。这可能会在你的书的后面的某个地方被介绍:-)
发布于 2009-09-30 17:18:43
在实践中,每个操作在继续之前都会获得所需的锁。SELECT将首先获取一行上的共享锁,然后读取该行。UPDATE将首先获取该行上的排它锁,然后更新该行。从理论上讲,你可以说“锁是获得的,然后是事务处理”,但在现实生活中,正是事务中的每个单独操作知道需要什么锁。
发布于 2009-09-30 17:07:43
如果它需要一个排它锁,它将阻塞另一个事务,或者在获得锁之前等待另一个事务完成。
需要排它锁的事情(更新/删除等)不会在任何其他对象访问数据时发生。
https://stackoverflow.com/questions/1499416
复制相似问题