关于DBMS锁定的澄清

时间:2009-09-30 16:59:05

标签: locking database

我正在参加数据库管理系统的介绍课程,并且有一个我的书没有回答的问题。这个问题不是来自我的作业,我只是好奇。

教科书不断强调交易是一个合乎逻辑的工作单元。但是,当遇到共享/独占锁定模式时,我有点困惑。

书中有一张图如下:

时间|交易状态

1请求锁定

2接收锁定

3流程交易

4释放锁定

5锁被释放

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

如果两个事务中的命令导致共享锁和独占锁,那么这些事务是同时运行还是一个接一个地安排?

5 个答案:

答案 0 :(得分:1)

实际上,每个操作在进行之前都会获取所需的锁定。 SELECT将首先获取行上的共享锁,然后读取该行。 UPDATE将首先获取该行的独占锁,然后更新该行。理论上你可以说'锁是获得的,然后是事务处理',但在现实生活中,事务中的每个单独操作都知道需要什么锁。

答案 1 :(得分:1)

答案是,像往常一样,“它取决于”: - )

一般来说,在开始之前你不需要取出所有锁;但是,在释放任何锁之前,您需要取出所有锁。 所以你可以做到以下几点:

lock resource A
update A
lock resource B
update B
unlock A
unlock B

这使您可以对其他可能想要读取B的事务更友好,例如,不关心A.它确实会带来更多风险 - 您可能无法锁定B,并决定回滚您的交易。他们是休息。

你也希望总是以相同的顺序获得所有锁,这样你就不会陷入僵局(事务1有A而且想要B; trans 2有B而且想要A;在中午高点对峙,没有如果你强制执行一致的顺序,则trans 2将尝试在B之前获得A并且等待,让trans 2继续,或者如果trans 1已经启动则失败,无论是哪种方式,都没有死锁。

当您有意图排除锁定时,事情会变得更有趣 - 锁定被视为与“选项”共享以使其独占。这可能会在本书后面的某处介绍: - )

答案 2 :(得分:0)

如果它需要一个独占锁,它将阻止另一个事务,否则它将在获得锁之前等待另一个事务完成。

当其他任何东西正在访问数据时,不会发生需要排他锁(UPDATE / DELETE / etc)的事情。

答案 3 :(得分:0)

一般锁定是在运行时确定的。处理BEGIN TRANSACTION命令时,事务中尚未运行任何内容,因此没有锁定。随着命令在事务锁中执行,将获取锁。

答案 4 :(得分:0)

“如果两个事务中的命令导致共享锁定以及独占锁定,那么这些事务是同时运行还是一个接一个地安排?”

锁定不仅仅包含“共享/独占”概念。关于锁的最重要的事情是它适用于资源。

两个事务,每个事务对不同资源(例如,两个单独的表,或两个单独的分区,或两个单独的页,或两个单独的行,或两个单独的打印机,或两个)持有独占锁单独的IP端口,...)可以继续并发运行而没有任何问题。

当事务请求锁定某些资源时,事务序列化才变得必要,其中该锁的共享模式与某个其他事务在同一资源上持有的锁不兼容。

如果您的教科书在您陈述时确实给出了事件序列,那么请将其丢弃。在处理事务时会出现锁定请求,并且事务处理器没有明确的最终方法在事务开始时知道它将需要哪些锁定(否则死锁将是一个非限制性问题)。