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的相同行为与传统锁有所不同,随便说:
SERIALIZABLE
隔离级别,并获得所涉及事务的任何串行执行都无法获得的最终状态
在您的特定情况下,SELECT
不会因为1而阻塞。但是,选择。。。FOR UPDATE
确实会被阻止,因为它充当“某种”写入程序,因此会被其他写入程序阻止
推荐链接:
select*
而不带where,因为它显示相同的行为并访问所有行以避免旁道