ACID、事务隔离、脏读、可重复读、幻读

ACID的概念:

  • 原子性(atomicity):一个事务中的操作,要么全部完成,要么全部不完成,若过程中发生错误,则恢复到事务开始之前的那个状态。

  • 一致性(consistency):事务的执行不能破坏数据库数据的完整性和一致性,一个事务在执行之前和执行之后,数据库都必须处于一致性状态。不一致的例子:事务执行了一半,只有一部分的数据写入了数据库,然后发生故障,导致数据不一致。

  • 隔离性(isolation):允许多个事务同时操作,但防止事务交叉执行导致数据的不一致。包括未提交读、已提交读、可重复读、串行化。

  • 持久性(durability):事务结束之后,数据的储存就是永久的,不会丢失。

事务的隔离级别:

脏读

不可重复读

幻读

read uncommitted(未提交读)

read committed(已提交读)

repeatable read(可重复读)

serializable(串行化)

并发事务存在的问题:

  • 更新丢失:多个事务选择同一行数据,最后提交的事务覆盖了前面提交的事务数据,造成更新丢失

  • 脏读:事务A读取到了事务B已修改,但未提交的数据。事务B回滚则数据不一致(不满足事务的一致性)

  • 不可重复读:事务A读取一次数据后,事务B修改了这些数据,事务A再次读取这些数据时,发现数据不一致(不满足事务的隔离性)

  • 幻读:事务A读取到了事务B提交后新增的数据(不满足事务的隔离性)

脏读、不可重复读、幻读的区别:

脏读:事务B还未提交的数据就被事务A读到了

不可重复读:事务B修改数据并提交,被事务A读到了

幻读:事务B新增、删除数据并提交,被事务A读到了