关系型数据库的事务四大特性(ACID)

  • 原子性:事务是最小的执行单位,不允许分割。原子性确保动作要么全部完成,要么不起作用。
  • 一致性:事务前后,数据库的状态都满足所有的完整性约束。
  • 隔离性:并发访问数据库时,一个用户的事务不被其他事务干扰,各并发事务之间的数据库是独立的。
  • 持久性:一个事务被提交之后,它对数据库中的数据改变是持久的,即使数据库发生故障也不应该对其有任何影响。

脏读、幻读、不可重复读

  • 脏读:A事务正在更新数据操作中,B事务读取了更新后的数据,但A事务因为某些原因RollBack了操作,则B事务读取的数据就不会是正确的数据。
  • 幻读:A事务中多次进行查询中B事务所做了添加操作,导致返回的结果集不同。
  • 不可重复读:A事务中多次进行查询中B事务所做了修改或删除,导致多次查询数据不一致。

事务的隔离级别

  • READ-UNCOMMITTED(读取未提交)
    最低的隔离级别,A事务可以读取B事务未提交的更新数据。
    会导致脏读幻读不可重复读
  • READ-COMMITTED(读取已提交)[Oracle默认]:
    允许读取并发事务已提交的数据。
    可以阻止脏读和不可重复读,但可能发生幻读
  • REPEATABLE_READ(可重复读)[MySQL默认]:
    对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改。
    可以阻止脏读和不可重复读,但可能发生幻读
  • SERIALIZABLE(序列化)
    最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行。
    防止脏读、不可重复读以及幻读

因为隔离级别越低,事务请求的锁越少,所以大部分数据库系统的隔离级别都是READ-COMMITTED(读取已提交),而InnoDB 存储引擎默认使用REPEATABLE-READ(可重复读)并不会有任何性能损失。InnoDB 存储引擎在分布式事务的情况下一般会用到SERIALIZABLE(序列化)隔离级别。

Last modification:March 21st, 2021 at 10:20 pm
我从来都不喜欢钱,我也没碰过钱,我对钱没兴趣