mysql四种隔离级别以及原理

事务4大特性:

原子性: undolog日志来保证, 记录了要回滚的日志信息, 事务回滚时撤销已经执行的sql.
一致性:由其它3大特性来保证。
隔离性: MVCC来保证, 多版本并发控制。
持久性:由redolog来保证, mysql修改数据会在redolog中记录一份日志数据, 就算没有保存成功, 只要日志保存成功, 数据就不会丢失,
mysql崩溃恢复功臣-redo log.


事务并发问题

修改丢失:两个事务同时修改一个数据, 发生了修改覆盖问题。
脏读: 事务A读取到了事务B中未提交的数据, 当事务B回滚的时候, 事务A读到的都是脏数据。
不可重复读:事务A多次读取同一数据, 但是每次读取的值都不同, 这是因为事务B多次对数据进行更新和修改.
幻读:事务A在操作过程中, 表多次新增和删除, 并且新增和删除的数据会最终影响到事务A操作结果。


mysql隔离级别:

数据库事务隔离级别有4个, 由低到高依次为:
RU->Read Uncommitted(读未提交), 脏读, 不可重复读、幻读都存在
所有读不加锁, 读到的数据都是最新数据, 性能最好
所有写加锁, 写完释放

RC->Read Commited(读已提交) :解决了脏读, 存在不可重复读, 幻读问题。
使用mvcc技术, 每行加入隐藏字段(DB_TRX_ID:修改改行的最后一个事务ID,DB_ROLL_PTR:指向当前行的undo log, DB_row_id:当前行标识, DELETE_BIT:删除标志), 它实现了不加锁的读操作。
写操作:加行级锁, 事务开始后, 会在undo日志中写入修改记录, 数据行中隐藏列DATA_POLL_PTR存储指向该行的undo记录的日志。
读操作:不加锁, 读取时, 如果该行被其他事务锁定, 则顺着隐藏列DATA_POLL_PTR指针, 找到上一个有效的历史记录(有效记录:该记录对当前事务可见,且DELETE_BIT=0)

RR->Repeatable Read(可重复读):解决了脏读, 不可重复读, 存在幻读。
适用mvcc技术实现不加锁的读操作

S->Serializable(串行化): 全部解决, 但是并发效率不高。

以上读已提交和可重复读操作基本相同, 区别在于,行记录对当前事务的可见性, 读已提交级别对数据可见性是该数据最新记录,
可重复读基本对数据可见性是事务开始时, 该数据的记录。


什么是MVCC?
多版本并发控制。
在这里插入图片描述
在这里插入图片描述
只有在读已提交(不可重复读) 和可重复读情况下才会有mvcc


mysql默认隔离级别是可重复读。
在这里插入图片描述
可重复读每次 都用的第一次读的时候创建的readview, 之后每次都是复用这次的readview
读已提交事务每次查询的开始都会生成一个独立的readview。
可重复读的性能肯定是要比不可重复读性能更高。
通过版本链+readview来实现mvcc。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孙仲谋111

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值