Python微信订餐小程序课程视频
https://edu.csdn.net/course/detail/36074
Python实战量化交易理财系统
https://edu.csdn.net/course/detail/35475
之前在讲 MySQL 事务隔离性提到过,对于写操作给读操作的影响这种情形下发生的脏读、不可重复读、虚读问题。是通过MVCC 机制来进行解决的,那么MVCC到底是如何实现的,其内部原理是怎样的呢?我们要抓住三个方面:记录中的4个隐藏字段、undo log 和 read view。
一、MVCC 定义和解决的读问题
1. 事务并发一致性的读问题
脏读(Dirty Read)
脏读也就是当前事务读取到了其他事务还未提交的数据。我们举个例子来看看:
Time | session A | session B |
---|---|---|
1 | -设置当前会话事务隔离级别为:读未提交 set session transaction isolation level read uncommitted; |
|
2 | -设置当前会话事务隔离级别为:读未提交 set session transaction isolation level read uncommitted; |
|
3 | start transaction; select * from account; |
|
4 | start transaction; select * from account; update account set user_name = '孙七' where id = 6; |
|
5 | select * from account; 查询到了session B 中还没有提交的数据 |
不可重复读(Non-Repeatable Read)
不可重复读是两次读取的结果不相同,和脏读的区别就是不可重复读读到了其他事务提交后的数据。
举个实例来看看:
Time | session A | session B |
---|---|---|
1 | -设置当前会话事务隔离级别为:读已提交 set session transaction isolation level read committed; |
|
2 | -设置当前会话事务隔离级别为:读已提交 set session transaction isolation level read committed; |
|
3 | start transaction; select * from account; |
|
4 | start transaction; select * from account; update account set user_name='赵赵' where id = 1; -此时已经发生修改 select * from account; |
|
5 | select * from account; |
|
6 | commit; |
|
7 |
|