一、MySQL事务特性

事务必须满足4个特性ACID
A(acomicity):原子性,一个事务必须被视为一个不可分割的最小单元,整个事务又么成功,又么失败。
C(consistency):一致性,数据库总是从一个一致性的状态转换到另外一个一致性的状态。
I(isolation):隔离性,通常一个事务所修改在最终提交以前,对其事务是不可见的,mysql提供了4种隔离机制。
D(durability):一旦事务提交,则其所做的修改就会永久保存到数据库中。

1.1 隔离级别

在SQL标准语义定义了四种隔离级别,每一种都规定了一个事务中所做的修改,哪些在事务内和事务间是可见,哪些是不可见。较低级别的隔离通常可以执行更高的并发,系统的开销也更低。
READ UNCOMMITTED(读未提交):事务中的修改,即使没有提交,对其他事务都是可见的。
READ COMMITED(读已提交):一个事务从开始直到提交之前,所做任何修改对其他事务都是不可见的。
REPEATABLE READ(可重复读):MYSQL默认级别,该级别保证了在同一个事务中多次读取同样记录的结果的一致。解决脏读,但是无法解决幻读。
SERIALIZABLE(可串行化):串行化是最高的隔离级别。它通过强制事务串行执行,避免了前面说的幻读。串行化会在读取每一行数据上都加锁,所以可能导致大量的超时和锁争用的问题。实际应用中也很少用到这种隔离级别。只有在非常需要确保数据一致性而且可接受并发的情况,才考虑这种。

隔离级别 脏读 不可重复读 幻读 加锁读
读未提交 ×
读已提交 × ×
可重复读 × × ×
可串行化 × × ×

不可重复读:不可重复读,指事务读取数据前后,数据不一致,指update操作。
幻读:幻读,指事务读取数据前后,前后的行数不一致,指insert,delete操作。

1.2 自动提交

MySQL默认采用自动提交(AUTOCOMMIT)模式,如果不是自动显示地开始一个事务,则每个查询都被当做一个事务执行提交操作。在当前连接中可以通过设置AUTOCOMMIT变量来启用或者禁用自动提交模式。
image.png
设置:SET AUTOCOMMIT = 1 ;
1或者ON表示启用,0或者OFF表示禁用。当AUTOCOMMIT = 0 ;所有的查询都是在一个事务中,直到显式地执行COMMIT提交或者ROLLBACK回滚。

二、多版本并发控制

InnoDB的MVCC,是通过在每行记录后面保存两个隐藏的列来实现。这两个列,一个保存了行的创建时间,一个保存行的过期时间(删除时间)。存储的并不是实际的时间值,而是系统版本号。每开始一个新的事务,系统版本号都会自动递增。事务开始时刻的系统版本号作为事务的版本号,用来和查询到的每行记录的版本号进行比较。下面看一个在REPEATABLE READ 隔离级别下,MVCC具体是如何操作的。
SELECT
InnoDB 会根据以下两个条件检索每行记录:

  1. InnoDB只查找版本早于当前事务版本的数据行(行的系统版本号小于或者等于事务的系统版本号),这样确保事务读取的行,要么在事务开始前已经存在,要么事务自身插入或者修改过。
  2. 行的删除版本要么未定义,要么大于当前事务版本号。这可以确保读取的行,在事务开始前被删除。

INSERT
innoDB为新插入的每一个行保存当前系统版本号作为行版本号。
DELETE
innoDB为删除每一行保存当前系统版本号作为删除版本号。
UPDATE