事务的特性(ACID)

  • 原子性(Atomicity):要么一起成功,要么一起失败,是一个操作,不可分割
  • 一致性(Consistency):是指事务的执行不能破坏数据库数据的完整性和一致性,一个事务在执行前后,数据库都必须处于一致性状态。换句话说,事务的执行结果必须是使数据库从一个一致性状态转变到另一个一致性状态。
  • 隔离性(Isolation):多个并发事务操作是隔离的,不会彼此打扰
  • 持久性(Durability):修改之后是持久的,不会掉电就失效了

并发导致的不一致性

  • 脏读
    如果一个事务「读到」了另一个「未提交事务修改过的数据」,就意味着发生了「脏读」现象。

假设有 A 和 B 这两个事务同时在处理,事务 A 先开始从数据库中读取小林的余额数据,然后再执行更新操作,如果此时事务 A 还没有提交事务,而此时正好事务 B 也从数据库中读取小林的余额数据,那么事务 B 读取到的余额数据是刚才事务 A 更新后的数据,即使没有提交事务。

因为事务 A 是还没提交事务的,也就是它随时可能发生回滚操作,如果在上面这种情况事务 A 发生了回滚,那么事务 B 刚才得到的数据就是过期的数据,这种现象就被称为脏读

也就是事务B在A还没提交之前就已经读到了修改的数据,但是A因为某些原因回滚了,这个时候B就读到了脏数据,称为脏读

  • 不可重复读
    在一个事务内多次读取同一个数据,如果出现前后两次读到的数据不一样的情况,就意味着发生了「不可重复读」现象。

假设有 A 和 B 这两个事务同时在处理,事务 A 先开始从数据库中读取小林的余额数据,然后继续执行代码逻辑处理,在这过程中如果事务 B 更新了这条数据,并提交了事务,那么当事务 A 再次读取该数据时,就会发现前后两次读到的数据是不一致的,这种现象就被称为不可重复读。

也就是A读到了B修改前和修改后的两次数据,不一致的问题,就是不可重复读

  • 幻读