数据库事务ACID
2020-10-25 / Lampkins   

事务具有4个特征,分别是原子性、一致性、隔离性和持久性,简称事务的ACID特性;

一、原子性(atomicity)

一个事务要么全部提交成功,要么全部失败回滚,不能只执行其中的一部分操作,这就是事务的原子性

二、一致性(consistency)

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

如果数据库系统在运行过程中发生故障,有些事务尚未完成就被迫中断,这些未完成的事务对数据库所作的修改有一部分已写入物理数据库,这是数据库就处于一种不正确的状态,也就是不一致的状态

三、隔离性(isolation)

事务的隔离性是指在并发环境中,并发的事务时相互隔离的,一个事务的执行不能不被其他事务干扰。不同的事务并发操作相同的数据时,每个事务都有各自完成的数据空间,即一个事务内部的操作及使用的数据对其他并发事务时隔离的,并发执行的各个事务之间不能相互干扰。

在标准SQL规范中,定义了4个事务隔离级别,不同的隔离级别对事务的处理不同,分别是:未授权读取,授权读取,可重复读取和串行化

1、读未提交(Read Uncommited)

该隔离级别允许脏读取,其隔离级别最低;比如事务A和事务B同时进行,事务A在整个执行阶段,会将某数据的值从1开始一直加到10,然后进行事务提交,此时,事务B能够看到这个数据项在事务A操作过程中的所有中间值(如1变成2,2变成3等),而对这一系列的中间值的读取就是未授权读取

2、授权读取也称为已提交读(Read Commited)

授权读取只允许获取已经提交的数据。比如事务A和事务B同时进行,事务A进行+1操作,此时,事务B无法看到这个数据项在事务A操作过程中的所有中间值,只能看到最终的10。另外,如果说有一个事务C,和事务A进行非常类似的操作,只是事务C是将数据项从10加到20,此时事务B也同样可以读取到20,即授权读取允许不可重复读取。

3、可重复读(Repeatable Read)

就是保证在事务处理过程中,多次读取同一个数据时,其值都和事务开始时刻是一致的,因此该事务级别==禁止不可重复读取和脏读取,但是有可能出现幻影数据。==所谓幻影数据,就是指同样的事务操作,在前后两个时间段内执行对同一个数据项的读取,可能出现不一致的结果(一般出现在一个事务中一起使用了当前读和快照读)。在上面的例子中,可重复读取隔离级别能够保证事务B在第一次事务操作过程中,始终对数据项读取到1,但是在下一次事务操作中,即使事务B(注意,事务名字虽然相同,但是指的是另一个事务操作)采用同样的查询方式,就可能读取到10或20;

4、串行化

是最严格的事务隔离级别,它要求所有事务被串行执行,即事务只能一个接一个的进行处理,不能并发执行。

隔离性级别的总结

隔离级别/存在的问题 脏读 不可重复读 幻读
读未提交
读已提交 -
可重复读 - -
可序列化 - - -

在基于锁的并发控制中,依靠不同的锁持有时间实现各隔离级别。锁均从操作前开始持有,”S”表示操作结束后释放,”C”表示事务提交后释放:

隔离级别/问题 写锁 读锁 范围锁
读未提交 S S S
读已提交 C S S
可重复读 C C S
可序列化 C C C

MySQL的默认隔离级别是可重复读,解决了脏读、部分不可重复读问题,有幻读问题。

多版本并发控制(MVCC)

MVCC是指维持一个数据的多个版本,使得读写操作没有冲突,快照读是MySQL为了实现MVCC的一个非阻塞读功能。

  • 快照读:读取的是MySQL对应数据的历史版本,如:select

  • 当前读:读取的最新数据结果,如:select lock in share mode、select for update、insert/delete/update

  • undo log:回滚日志,主要保存了数据的基本信息,比如说日志开始的位置、结束的位置,主键的长度、表id,日志编号、日志类型,purge线程会清理不需要回滚且不参与MVCC记录

  • ReadView:当前事务在进行快照读时,会生成一个读视图来进行可见性判断,在可见性算法中,不同的隔离级别生成readview的时机是不同的。RC:每次执行快照读都会生成新的readview;RR:只有在当前事务中第一次快照读时才生成,之后的快照读都使用当前readview

四、持久性(durability)

一旦事务提交,那么它对数据库中的对应数据的状态的变更就会永久保存到数据库中。–即使发生系统崩溃或机器宕机等故障,只要数据库能够重新启动,那么一定能够将其恢复到事务成功结束的状态。

来源:
https://www.jianshu.com/p/fc8a654f2205

https://blog.csdn.net/echizao1839/article/details/90378014

本文链接:
http://lampkins.gitee.io/2020/10/25/%E6%95%B0%E6%8D%AE%E5%BA%93%E4%BA%8B%E5%8A%A1ACID/