MySQL实战之事务
前言
- 作为关系型数据库第一梯队的成员,MySQL的事务处理原理一直是研究的对象,今天就聊聊它
事务
- 事务的隔离级别
- 读未提交(RU)
- 读已提交(RC)
- 可重复读(RR)
- 串行化 (SL)
- 没有做对应的事务处理会发生的问题
- 脏读:一个事务读到了另一个事务没有提交的数据
- 脏写:两个事务同时修改一个值,A先改,B后改正常应该是B修改的值,但是A由于种种原因回滚了,这个时候数据就回滚到A修改之前的状态了
- 不可重复读:第一次读到了数据,再读没有啦,反之亦然
- 幻读:一样的条件,读到的数据不一致
- MySQL的解决方案(MVCC)
- ReadView
- Undo Log版本链
- 以读已提交为例进行说明
- 之前有提到过,一行数据包含有隐藏字段,事务id和roll_pointer, 来张图示意一下更新数据
- 这个时候还有几个概念需要理解一下
- 当前事务的id, 它是随者时间递增的
- 现在还有哪些事务id没有提交
- 当一个事务读取数据时,首先生成一个快照,这个时候就知道了快照中的事务id,然后看当前除自己以外没有提交的事务id中包含不包含快照中的id,如果没有直接读取就好啦, 如果有的话说明事务还没有提交,沿着undo log版本链查看undo log,以此类推即可获取到值
- 之前有提到过,一行数据包含有隐藏字段,事务id和roll_pointer, 来张图示意一下更新数据