上一篇我们了解了mysql的几种日志,大致知道这些日志的作用,今天我们配合Mysql的事务以及事务的隔离级别进一步理解mysql如何实现事务相关的特性。其中重点理解mysql innodb的多版本控制和乐观锁,这篇大部分是文字描述,也是理解mysql-innodb事务的基础内容,也是面试会问到的内容。
事务的特征ACID
原子性:事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全都不执行。上一篇我们知道 redo log 用于保证事务持久性,是因为每次数据变更,mysql都会先记录redo log,然后更新到数据页的缓存,然后在刷到磁盘中;那mysql是如何实现原子性的呢,首先理解原子性,就是一组操作单元,要么全部执行成功,要么不执行,我们在做分布式的系统的时候,就会涉及到分布式的事务,两个分布式操作,要么都成功,要么都失败,所有的操作都需要回滚到最初的状态,我们所了解有XA协议规则,XA是比较老的分布式事务基础,它的核心思路是基于两阶段提交的方式,第一阶段,数据准备,然后锁住资源,第二步才会提交。今天我们不讨论分布式事务的方案,这里不做深入研究,大家可以了解一下两阶段和TCC三阶段,以及Base定理和CAP定理。好了,言归正传,我们从工作中的场景,来反向思考,mysql的事务是如何实现的呢?对于一个事务如何保证这些语句最终能保证原子性呢?上一篇讲到了redolog 和binlog的一致性方案,就涉及到两阶段提交的方式来保证一致性。这里要讲的是Mysql的undo log,它是保证事务的原子性和隔离性的基础。
我们知道mysql事务中只要对数据修改的,都会生成相应的undo日志,1.对于每个 insert,这会往undo日志插入一条对应的删除语句,回滚时会执行 delete2.对于每个 delete,回滚时会执行 insert。3.对于每个 update,回滚时会执行一个相反的 update,把数据改回去。以 upd