mysql 事务及其MVCC原理

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问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值