关系型数据库的事务四大特性(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(序列化)
隔离级别。