mysql原理(⼗)当前读与快照读
⾸先我们做⼀个模拟,执⾏以下的sql,其中有如下图数据:
image.png
时
间
会话1会话2会话3
1begin;
select * from t_student where id = 2
2update t_student set age = age + 1 where id =2;;
mysql怎么读英语3begin;
update t_student set age = age + 1 where id =2;;
4select * from t_student where id =2; COMMIT
5select * from t_student where id = 2;
6COMMIT;
select * from t_student where id = 2;
我把执⾏结果按照表格如下展⽰:
使用css3制作导航菜单时间会话1会话2会话3
115
2
sql2008数据库管理工具3
417
515
617
安卓手机一键重装系统分析:
在会话1当中,只有当会话1的事务提交后,才能查到最终会话2更改的数据。
在会话2当中,开启事务后更新数据,之后查询发现数据变成了17。
针对上⾯的现象我们进⾏个原理分析:
实际上产⽣上述显现是因为InnoDB采⽤的MVCC(多版本并发控制),其中针对每条数据会有它⾃⼰的事务id,以及⼀个最⼤事务id。针对事务中数据每次修改,会产⽣不同的版本。
1)假设开始id = 2的数据,其事务txid = 1000;
免费数据查询网站2)当会话1开始,此时txid变成了1001,⽽会话2开启,txid⼜变成了1002,同理会话3会变成1003,此时都⽣成了不同版本的快照。
3)会话1在事务当中去读取时候,采⽤了快照读的⽅式,即拿到⼀个1001的事务id,此时只会读取⼩
ospf协议是什么路由协议于等于⾃⼰版本的数据,所以在事务中最终
只能拿到值为17的数据。
4)会话2在更新数据的时候,采⽤的当前读的⽅式,即对数据增加X锁,获取最新的事务id,读取最新的版本数据。所以在更新之前,就读取到了age的年龄是16,之后在进⾏+1,得到17.
总结⼀下:
快照读解决了幻读的问题,即多次读取数据不⼀致的问题。
update、insert、delete都会执⾏当前读,防⽌并发更新数据导致数据错误,此过程或添加X锁。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论