MySQL学习笔记之再谈事务隔离级别(八)

声明:本文章内容是根据极客时间中林晓斌的课程《MYSQL45讲》,经过学习,加以自己的理解形成的笔记。具体原文可以到官网进行阅读。如有侵权请,告知删除。

回顾

可重复读:在事务启动的时候会创建一个视图read-view,之后的如果有其他事务进行修改的话,该事务看到的数据视图和启动时候看到的是一样
读提交:每次sql语句执行的时候会创建一次视图,以该视图的数据为标准,获取数据。
行锁:事务更新一行数据的手,如果还有其他事务在更新这行数据,那么他必须等上一个事务释放该锁,自己才能获得锁,进行更新。

正文

实验的初始数据(K,V) (1,1)(2,2)
在这里插入图片描述
注意:

begin/start transaction 命令并不是一个事务的起点,在执行到它们之后的第一个操作 InnoDB 表的语句,事务才真正启动。如果你想要马上启动一个事务,可以使用 start transaction with consistent snapshot 这个命令。

sql语句的执行顺序是
事务C set k = k+1 此时 k = 2
事务B set k = k +1 然后 get k
事务A get k
结果
此时的执行结果是 事务B获取到的结果是 K = 3 事务A获取到的结果是K = 1;此时会不会觉得很奇怪 怎么C事务更新的数据2 , 会被事务B 读取到, 执行之后 变成3.
答案:
每个事务执行的时候都会有个id;然后每个事务都会存在一个视图数组,用来存储当前活跃事务的ID
在这里插入图片描述
一个数据版本,对于一个事务视图来说,除了自己的更新总是可见以外,有三种情况:
1、版本未提交,不可见;
2、版本已提交,但是是在视图创建后提交的,不可见;
3、版本已提交,而且是在视图创建前提交的,可见。

事务B的update

按照快照可重复读的原则,事务B的视图数组死之前生成的 ,之后事务C才提交 怎么能查询出(1,2)然后更成(1,3)呢?
更新数据都是先读后写的,而这个读,只能读当前的值,称为“当前读”(current read)。因此,在更新的时候,当前读拿到的数。当前读也就是读取最新版本的数据。
下列情况写法的select语句,也可以执行当前读:

select k from t where id=1 lock in share mode;// 共享锁 S
select k from t where id=1 for update;// 读锁  X
小结
  • 于可重复读,查询只承认在事务启动前就已经提交完成的数据;
  • 对于读提交,查询只承认在语句启动前就已经提交完成的数据;
    当前读,总是读取已经提交完成的最新版本。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值