MVCC行锁定与教科书交易行为

时间:2014-04-07 21:07:30

标签: mysql sql concurrency transactions innodb

我对交易理论和实施感到困惑 根据教科书,数据项有共享和排他锁,这些锁是冲突的。因此,如果事务具有独占锁(用于插入/更新),则即使对于读取(选择/共享锁),也没有其他事务可以访问该数据项。 到目前为止这一点很清楚。但这在实际实施中似乎没有这种方式 mysql中的示例:

session1> begin;  
session2> begin;  
session2> insert into table (id, desc) values (1234, 'test');  
session1> select * from table;

执行会话1的选择。如果我将其替换为select ...for update,则仅阻止 但我不明白为什么普通选择不会阻止。它应该得到一个与独占/写锁相冲突的共享锁 这似乎是由于MVCC,但这是否意味着MVCC不遵守有关交易互动的教科书描述? 我在DELETE而不是INSERT

中看到的行为相同

1 个答案:

答案 0 :(得分:1)

MVCC与传统锁有些不同,随便说:

  1. 作家不会阻止读者
  2. 读者不会阻止任何人,也不会被任何人阻止。
  3. 如果您想要可扩展性,这是一个关键功能,因为它避免了很多争用。它有一个棘手的问题:在某些情况下,MVCC的行为并不像您可以直观地预期的那样。然而,MVCC太有用了,不能忽视,所以你只是了解它的细微差别。最典型的一个是您可以使用SERIALIZABLE隔离级别并获得最终状态,这是您无法通过任何串行执行所涉及的事务获得的。

    在您的特定情况下,SELECT不会因为1而被阻止。但是,SELECT ... FOR UPDATE会阻止,因为它充当了作家的“类型”,因此被其他作者阻止。

    推荐链接: