Mysql MVCC行锁定与常规事务行为

Mysql MVCC行锁定与常规事务行为,mysql,sql,concurrency,transactions,innodb,Mysql,Sql,Concurrency,Transactions,Innodb,我对交易的理论和实现感到困惑。 根据教科书,数据项上有共享锁和独占锁,并且这些锁相互冲突。因此,如果一个事务具有独占锁(用于插入/更新),则其他事务甚至无法访问数据项(用于读取)(选择/共享锁)。 到目前为止,这是清楚的。但在实际的实现中,这种方式似乎不起作用。 mysql中的示例: session1> begin; session2> begin; session2> insert into table (id, desc) values (1234, 'test')

我对交易的理论和实现感到困惑。
根据教科书,数据项上有共享锁和独占锁,并且这些锁相互冲突。因此,如果一个事务具有独占锁(用于插入/更新),则其他事务甚至无法访问数据项(用于读取)(选择/共享锁)。
到目前为止,这是清楚的。但在实际的实现中,这种方式似乎不起作用。
mysql中的示例:

session1> begin;  
session2> begin;  
session2> insert into table (id, desc) values (1234, 'test');  
session1> select * from table;
执行会话1的选择。仅当我将其替换为
select…for update

但是我不明白为什么普通的select不阻塞。它应该获得一个共享锁,该锁将与独占/写入锁冲突。
这似乎是由于MVCC造成的,但这是否意味着MVCC不遵守关于事务交互的教科书描述?

我看到的
DELETE
而不是
INSERT

MVCC的相同行为与传统锁有所不同,随便说:

  • 作家不会阻止读者
  • 读者不会阻挡任何人,也不会被任何人阻挡
  • 如果您想要可伸缩性,这是一个关键特性,因为它避免了很多争用。它有一个棘手的问题:在某些情况下,MVCC的行为并不像您直观地期望的那样。然而,MVCC非常有用,不容忽视,因此您只需了解它的细微差别。最典型的一种是,您可以使用
    SERIALIZABLE
    隔离级别,并获得所涉及事务的任何串行执行都无法获得的最终状态

    在您的特定情况下,
    SELECT
    不会因为1而阻塞。但是,
    选择。。。FOR UPDATE
    确实会被阻止,因为它充当“某种”写入程序,因此会被其他写入程序阻止

    推荐链接:


    I更新为
    select*
    而不带where,因为它显示相同的行为并访问所有行以避免旁道