mysql事务分为四类 4种隔离级别
1.未提交读 (READ UNCOMMITTED/RU) RU
SessionA: A读取B中update中未commit中的数据,读到的xxx 若此时B进行了rollback回滚操作。A中读取到的值依然是B 修改后的这个值,
这就是所谓的脏读
SessionB:update table set c=‘xxx’ where xxx
2.已提交读 (RC) 不可重复读 (MVCC多版本并发控制用到了此种隔离级别)
SessionA:A开启事务 ,A可以读取到B 每次update后的数据,照成不可重复读取,每次修改都产生一个新的数据多个版本
SessionB; 对数据进行修改操作并提交 (Update 默认提交)
3.RR (可重复读) mysql默认的隔离级别
容易出现幻读。该隔离级别下,若B进行了insert或者delete操作,导致读取的记录数据不一致此种情况称为 就是 幻读
SessionA: 开始事务A 每次读取的都是第一次未修改的数据
SessionB: 进行update 每次进行修改数据
4。串行化 (SERIALIZABLE)
读和写都上锁。效率很低。
为了解决事务之间的并发问题有2种方式
1.读写上锁。
2.MVCC多版本并发控制 一般用第二种
版本链:回滚段/
undo log:
**insert undo log 插入时产生的一种undo log 日期
update undo log 修改或删除产生的一种undo log 日志
**
上图为版本链指针由最先的记录指向之前数据的记录(类似于git这样版本控制,第一次 插入时回滚指针为Null,以后每插入一条记录事务ID会增加)
对于RU级别来说:每次读取最新的记录就好
SERIALIZABLE :每次都上读写锁来解决
只有在RC和RR 级别下需要版本链表找到可见的事务id并判断当前事务是否是需要的数据。每次读取都会产生事务id。事务id形成链表组成m_ids。根据当前事务id于m_ids比较大小 进行判断是否是可见的
规则如下:
什么时候产生事务id和什么时候产生READVIEW问题