MySQL
事务隔离
ACID
- 原子性、一致性、隔离性、持久性
隔离性
- 出现场景:当数据库上有多个事务同时执行的时候,就可能出现脏读,不可重复读,幻读的问题。隔离性就是为了解决这些问题
- 当隔离级别越大,效率就会越低,在实际应用中需要寻找一个平衡点。
- 隔离级别
- 读未提交:一个事务还没教教,变更就能被其他事务看到
- 读提交:事务提交后,变更才能被其他事务看到
- 可重复读:一个事务执行过程中看到的数据总是跟这个事务在启动时看到的数据是一只的。在可重复读的隔离级别下,未提交变更对其他事务也是不可见的。
- 串行化:对于同一行记录,写会加写锁,读会加读锁。当出现读写锁冲突时,后访问的事务必须等前一个事务执行完成,才能继续执行。
- 可重复读和读提交的实现都有视图的参与。读未提交没有,串行化则通过加锁避免访问
- 可重复读:视图在事务启动时创建,整个事务存在期间都用这个视图
- 读提交:在每个sql语句开始执行的时候创建
事务隔离的实现(可重复读)
在MySQL中,每条记录在更新的时候都会同时记录一条回滚操作。记录上的最新值,通过回滚操作,可以得到前一个状态的值。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Jij3NAsz-1619508609883)(/Users/jiangwenting/Library/Application Support/typora-user-images/image-20210425214058499.png)]
当前值是4,开始时间不同的事务读到的值不一定是一样的。例如开始时间读到1的时候,这个时候再读,则需要将当前值执行图中的所有回滚操作得到。
回滚日志不可能一直保留,当系统里没有比回滚日志更早的read-view的时候,这些回滚日志就可以删除。