mysql四种隔离级别

基本概念解释

事务的四大特性:
1)原子性

事务作为一个整体,要么全部执行,要么都不执行。

2)一致性

事务执行前后,数据的整体性不会被破坏。
比如A和B各有100元,A给了B10元,事务前后他们总钱数都是200元不变。

3)隔离性

多个事务并发执行时,事务之间互不干扰。

4)持久性

事务提交后,数据操作的结果会被永久保存。

构建测试环境

创建一个表,拥有序号、姓名、携带金额如下。

idnamemoney
1Alex100
2Bob100
3Cindy100

RU(读未提交)

RU采取读不加锁原理。
事务读不加锁,不阻塞其他事务的读和写;
事务写阻塞其他事务写,但不阻塞其他事务读。
事务顺序号事务A事务B
1begin
2读取Alex的金额是100
3begin
4修改Alex的金额为90
5读取Alex的金额为90

事务B没有提交,事务A却读取到了同一行内容,不同的数据。 出现脏读

RC(读已提交)

事务顺序号事务A事务B
1begin
2读取Alex的金额是100
3begin
4修改Alex的金额为90
5commit
6读取Alex的金额为90
7commit

事务A在进行的过程中,有一段完整的事务B,事务B对同一行内容的修改,使得事务A两次读取了不同的内容。读取同一条数据,却返回不同的内容。
出现不可重复读

RR(可重复读)

事务顺序号事务A事务B
1begin
2读取id大于等于2的金额,即Bob和Cindy的100
3begin
4插入一行id等于4,name是David,金额90
5commit
6再次查询id大于等于2,得到3行数据

在事务A执行过程中,有新的添加或删除数据的事务B,使得事务A两次查询结果不同。
出现幻读

Serializable(串行化)

强制事务串行执行。
读操作和写操作都不允许并发执行。

不同隔离级别遇到的问题

隔离级别脏读不可重复读幻读
读未提交
读已提交×
可重复读××
串行化×××

MVCC实现原理

通过 Read View 和 Undo Log实现。Undo Log保存历史快照,Read VieW 判断数据是否可见。

Read View 是执行SQL语句时产生的读视图,来判断当前事务可见哪个版本的数据。

Undo Log 是回滚日志,记录数据被修改前的信息,数据在修改前会被拷贝到 Undo Log 中。当 delete 一条数据时,会在 Undo LOg 中增加一条对应的 insert 记录。 (记录相反的操作信息)
Undo Log 在事务回滚时,保持其原子性和一致性,并用于MVCC快照读。

1)获取事务ID
2)获取Read View
3)查询得到的数据,然后对事务版本号进行比较。
4)如果不符合Read View的可见性规则, 即就需要Undo log中历史快照;
5)最后返回符合规则的数据
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值