ACID
ACID,是指在可靠数据库管理系统(DBMS)中,事务(transaction)所应该具有的四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability).这是可靠数据库所应具备的几个特性.所以ACID就是这四大特性的缩写。
原子性(Atomicity)
整个语句要么执行完,要么不执行。
一致性(Consistency)
一致性即在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。
隔离性(Isolation)
隔离性。事务的执行是互不干扰的,一个事务不可能看到其他事务运行时,中间某一时刻的数据。
持久性(Durability)
持久性,意味着在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。即使出现了任何事故比如断电等,事务一旦提交,则持久化保存在数据库中.
事务的并发安全
脏读 :脏读指的就是读脏数据,一个事务并未提交的数据便是脏数据。
不可重复读 :一个事务在执行期间无论重复读取多少次数据,返回的结果都应该与第一次读取到的数据一致。
幻读 : 幻读侧重的是整行的数据变化,如果一个事务在执行期间读取到的结果数量不相同,那就说明读取到了幻影数据,发生了幻读问题。

事务的隔离级别
一、READ-UNCOMMITTED: 未提交读
二、READ-COMMITTED: 提交读
三、REPEATABLE-READ:可重复读
四、SERIALIZABLE:串行读
MySQL四种隔离级别详解
https://zhuanlan.zhihu.com/p/89782673
多版本并发控制
悲观锁和乐观锁
悲观锁:假定大概率会发生并发更新冲突,访问和处理过程中都会加排他锁,整个事务过程中锁定数据,只有当事务提交或者回滚后才释放锁。
乐观锁:假定大概率不会发生并发更新冲突,访问和处理数据过程中不加锁,只在更新数据时再根据版本号和时间戳判断是否有冲突(版本号不一致),有则处理,无则提交事务。
MVCC
概述
MVCC,Multi-Version Concurrency Control,多版本并发控制。MVCC 是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问;
在MYSQL中,MyISAM使用的是表锁,InnoDB使用的是行锁。而InnoDB的事务分为四个隔离级别,其中默认的隔离级别REPEATABLE READ需要两个不同的事务相互之间不能影响,而且还能支持并发,这点悲观锁是达不到的,所以REPEATABLE READ采用的就是乐观锁,而乐观锁的实现采用的就是MVCC。正是因为有了MVCC,才造就了InnoDB强大的事务处理能力。
MVCC解决的问题是读写互相不阻塞的问题,每次更新都产生一个新的版本,读的话可以读历史版本。试想,如果一个数据只有一个版本,那么多个事务对这个数据进行读写是不是需要读写锁来保护?
一个读写事务在运行的过程中在访问数据之前先加读/写锁这种实现叫做悲观锁,悲观体现在,先加锁,独占数据,防止别人加锁。
乐观锁呢,读写事务,在真正的提交之前,不加读/写锁,而是先看一下数据的版本/时间戳,等到真正提交的时候再看一下版本/时间戳,如果两次相同,说明别人期间没有对数据进行过修改,那么就可以放心提交。
乐观体现在,访问数据时不提前加锁。在资源冲突不激烈的场合,用乐观锁性能较好。如果资源冲突严重,乐观锁的实现会导致事务提交的时候经常看到别人在他之前已经修改了数据,然后要进行回滚或者重试,还不如一上来就加锁。所以通常我们把没有开启MVCC特性的,使用原来的锁机制来保证数据一致性的这种锁叫悲观锁,而对开启MVCC机制的锁,叫做乐观锁。
实现
MVCC是通过保存数据在某个时间点的快照来实现的. 不同存储引擎的MVCC实现是不同的,典型的有乐观并发控制和悲观并发控制. InnoDB的MVCC,是通过在每行记录后面保存两个隐藏的列来实现的,这两个列,分别保存了这个行的创建时间,一个保存的是行的删除时间。这里存储的并不是实际的时间值,而是系统版本号(可以理解为事务的ID),没开始一个新的事务,系统版本号就会自动递增,事务开始时刻的系统版本号会作为事务的ID.
示例详解: