ACID、隔离级别、脏读不可重复读幻读

674 阅读3分钟

ACID和隔离级别和脏读不可重复读幻读

ACID

ACID是什么?

  • A    原子性(atomicity)
  • C    一致性(consistency)
  • I    隔离性(isolation)
  • D    持久性(durability)

原子性(atomicity):

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

一致性(consistency):

事务的执行不能破坏数据库数据的完整性和一致性,一个事务在执行之前和执行之后,数据库都必须处于一致性状态。
如果数据库系统在运行过程中发生故障,有些事物尚未完成就被迫中断,这些未完成的事务对数据库所作的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,也就是不一致的状态。

隔离性(isolation):

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

持久性(durability):

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

脏读不可重复读幻读

脏读

事务改变了未提交,事务2读到了事务1更改的内容。

不可重复读

一个事务范围内,多次查询返回了不同的内容,(因为数据被另一个事务更改了)
脏读读到的是一个未提交的数据,而不可重复读读到的是另一个事务提交的数据

幻读

幻读是事务非独立执行时发生的一种情况。当事务1正在批量修改一批数据为1->2时,另一个事务向表中插入了一条数据1。事务1再查看修改的数据,则会发现有一条为1。
幻读和不可重复读都读取了另一已提交的事务。不同的是,不可重复读查询的是同一数据,而幻读是针对一批数据的查询。

解决不可重复读的方式是锁行。解决幻读的方式是锁表。

隔离级别

隔离级别是什么?

在标准SQL规范中,定义了4个事务隔离级别,不同的隔离级别对事务的处理不同,分别是:

  • 读未提交(Read Uncommited)
  • 读已提交(Read Commited)
  • 可重复读(Repeatable Read)
  • 串行化(Serializable)

MySQL默认隔离级别是可重复读(Repeatable Read)

读未提交(Read Uncommited)

该隔离级别允许脏读取,其隔离级别最低。
比如事务A和事务B同时进行,事务A更改数据未提交,事务B能读取到事务A更改未提交的内容,即为读未提交。

读已提交(Read Commited)

只能读到已经提交的数据。
比如事务A和事务B同事进行,事务A更改数据未提交,事务B不能读取到事务A更改的内容。当事务A提交完成,事务B可以读取到事务A更改的内容。

可重复读(Repeatable Read)

保证在事务处理过程中,多次读取同一个数据时,其值和事务开始时是一致的。
可避免脏读、不可重复读

串行化(Serializable)

最严格的隔离几倍,要求所有事务串行执行。
可避免脏读、不可重复读、幻读