什么是 MySQL InnoDB 下的当前读和快照读?
- 一致性非锁定读(快照读),普通的SELECT,通过多版本并发控制(MVCC)实现。
- 一致性锁定读(当前读),SELECT … FOR UPDATE/SELECT … LOCK IN SHARE MODE/INSERT/UPDATE/DELETE,通过锁实现。
实验一
session1 | session2 | |
---|---|---|
查看事务隔离级别 | select @@session.tx_isolation; ![]() | select @@session.tx_isolation; ![]() |
查看数据 | select * from goods where id=1;![]() | select * from goods where id=1;![]() |
开启事务 | begin; | begin; |
会话1更新数据 | update goods set price=101 where id=1; ![]() | |
查看数据 | select * from goods where id=1;![]() | select * from goods where id=1; ![]() |
会话1事务提交 | commit; | |
会话2查看数据 | select * from goods where id=1; ![]() | |
会话2事务提交 | commit; |
实验二
session1 | session2 | |
---|---|---|
查看事务隔离级别 | select @@session.tx_isolation; ![]() | select @@session.tx_isolation; ![]() |
查看数据 | select * from goods where id=1;![]() | select * from goods where id=1;![]() |
开启事务 | begin; | begin; |
会话1更新数据 | update goods set price=101 where id=1; ![]() | |
查看数据 | select * from goods where id=1;![]() | |
会话1事务提交 | commit; | |
会话2查看数据 | select * from goods where id=1; ![]() | |
会话2事务提交 | commit; |
2个实验表明,快照读的时机不同,结果也会不同。