@Catyee
2021-08-07T17:21:39.000000Z
字数 1274
阅读 373
mysql
我们都知道事务就是一组不可拆分的工作单元,在数据库中事务内的sql语句,要么全部执行成功,要么全部执行失败,这样可以保证数据库总是从一种一致性的状态转换为另外一种一致性的状态。
任何事务处理系统,都必须具有ACID的标准特征,所谓ACID也就是我们熟知的原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability)。
原子性:指整个事务是不可分割的工作单位。事务中所有的操作都执行成功,才算整个事务成功。事务中任何一个操作执行失败,已经执行成功的操作也必须撤销,数据库状态应该退回到执行事务前的状态。
一致性:一致性指事务将数据库从一种状态转变为下一种一致的状态,在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。事务是一致性的单位,如果事务中某个动作失败了,系统可以自动撤销事务——返回事务执行之前的状态。
隔离性:事务的隔离性要求每个读写事务的对象对其他事务的操作对象能相互分离,即该事务提交前对其他事务都不可见,听起来很容易,但对于计算机来说这是一个很难的问题,通常需要使用锁来实现,但是完全的使用锁会导致执行效率的下降,所以当前数据库系统中都提供了一种粒度锁的策略,允许事务仅锁住一个实体对象的子集,以此来提高事务之间的并发度。
持久性:指事务一旦提交,其结果就是永久性的,即使发生宕机等故障,数据库也能将数据恢复。但是不包括硬件的损坏等灾难性的原因,所以持久性只能保证事务系统的高可靠性(High Reliability),但是不能保证高可用性(High Availability)。
InnoDB中事务的ACD是通过事务日志也就是Redo Log和Undo Log来实现的,而隔离性是通过锁来实现的。
程序员总是喜欢分工明确,界限清晰的概念,然而真正的实现是复杂的,界限并没有那么清晰,Redo Log和Undo Log都有着多重的作用,且要通过配合才能实现一些复杂的特性(比如一致性),所以很难清晰的划分章节,要从整体上进行理解。
大体上来讲:
Innodb采用WAL策略来提高效率,也就是说在实际数据文件的修改落盘之前,事务日志已经落盘,从而保证事务的持久性;
Redo Log通过mtr(mini transaction)来保证对数据页操作的原子性;
从事务本身的角度来说,Undo Log在事务失败之后能够提供回滚操作,从而保证事务的原子性,而从数据库角度来说redo log和undo log配合可以保证数据库崩溃恢复时的整体一致性,也就是说数据库崩溃恢复时候既要用到redo log也要用到undo log从而让整个数据库达到一致性的状态;
另外Undo log也需要持久性保护,所以undo log也会产生redo log,undo log还用于实现MVCC。
以上就是对Redo Log和Undo Log的一个高度概括,每一个点都有着复杂的考虑和设计,需要用大篇幅文字来讲解。