一文理解MySQL的事务原则与事务隔离

ACID原则

事务具有四个原则:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。这四个特性简称为ACID原则。

  1. 原子性(Atomictiy):事务是一个包含一系列操作的原子操作。事务的原子性确保这些操作全部完成或者全部失败。

  2. 一致性(Consistency):事务的执行不能破坏数据库数据的完整性和一致性,一个事务在执行之前和执行之后,数据库都必须处于一致性状态。

如果数据库系统在运行过程中发生故障,有些事务尚未完成就被迫中断,这些未完成的事务对数据库所作的修改有一部分已写入物理数据库,此时数据库就处于不一致的状态。(在合格的数据库产品中,数据库重启后,会按照一定规则回滚所有导致不一致的事务)

  1. 隔离性(Isolation):数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。

  2. 持久性(Durabilit):事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

1. 原子性

原子性(Atomicity)的实现离不开MySQL的事务日志undo log日志类型,当事务需要回滚的时候需要将数据库状态回滚到事务开始前,即需要撤销所有已经成功执行的sql语句。undo log起了关键性作用。

当事务对数据库进行修改时,InnoDB会生成对应的undo log;如果事务执行失败或调用了rollback,导致事务需要回滚,便可以利用undo log中的信息将数据回滚到修改之前的样子。

undo log

undo log主要为事务的回滚服务。在事务执行的过程中,除了记录redo log,还会记录一定量的undo log。undo log记录了数据在每个操作前的状态,如果事务执行过程中需要回滚,就可以根据undo log进行回滚操作。单个事务的回滚,只会回滚当前事务做的操作,并不会影响到其他的事务做的操作。

undo log的作用:

  1. 为了保证数据的原子性,记录事务发生之前的一个版本,用于回滚,

  2. 通过mvcc和undo log实现innodb事务可重复读和读取已提交隔离级别。

其中,undo log分为:

  • insert undo log:insert操作中产生的undo log。

  • update undo log:delete和update操作产生的undo log。

  1. insert操作

因为insert操作的记录,只对事务本身可见,对其他事务不可见。故undo log可以在事务提交后直接删除,不需要进行purge操作,

  1. delete操作

Delete操作在事务中并不是真正的删除掉数据行,而是一种Delete Mark操作,在记录上标识Delete_Bit,而不删除记录。是一种"假删除",之后通过purge线程删除。(原因是为了支持MVCC)

  1. update操作

update分为两种情况:update的列是否是主键索引。

如果不是主键索引,在undo log中直接反向记录是如何update的。即update是直接进行的。

如果是主键索引,update分两部执行:先删除该行,再插入一行目标行。

与insert undo log不同的,update undo log日志,当事务提交的时候,innodb不会立即删除undo log, 会将该事务对应的undo log放入到删除列表中,之后通过purge线程删除。

因为后续还可能会用到undo log,例如隔离级别为repeatable read时的MVCC,事务读取的都是开启事务时的最新提交行版本,只要该事务不结束,该行版本就不能删除(即undo log不能删除),且undo log分配的页可重用减少存储空间和提升性能。

purge线程两个主要作用是:清理undo页和清除page里面带有Delete_Bit标识的数据行。

2. 一致性

一致性是通过事务的原子性、持久性和隔离性来保证的。

  • 原子性:语句要么全执行,要么全不执行,是事务最核心的特性,事务本身就是以原子性来定义的。实现主要基于undo log。

  • 持久性:保证事务提交后

你可能感兴趣的:(mysql,数据库,sql,面试,java)