【概念原理】四种SQL事务隔离级别和事务ACID特性
摘要: SQL事务隔离级别和事务的ACID特性
事务是一组读写操作,并且具有只有所有操作都成功才算成功的特性。
事务隔离级别
SQL事务隔离级别由弱到强分别是:READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ和SERIALIZABLE。
下表是这四种事务隔离级别对脏读、不可重复读和幻读的支持情况:
隔离级别 | 脏读(Dirty read) | 不可重复读(Non-repeatable read) | 幻读(Phantom read) |
READ_UNCOMMITED | 允许 | 允许 | 允许 |
READ_COMMITED | 不允许 | 允许 | 允许 |
REPEATABLE_READ | 不允许 | 不允许 | 允许 |
SERIALIZBLE | 不允许 | 不允许 | 不允许 |
脏读:
脏读指的是一个事务允许读取其他正在运行的事务还没有提交的改变。这种情况的发生主要因为没有加锁。
不可重复读:
不可重复读是指事务A读取了事务B已经提交的更改数据。不可重复读指的是一个事务内连续读却得到不同的结果,主要因为同时有其他事务更新了我们正在读取的数据。要达到允许可重复读的目的,我们必须让当前事务保持一个读共享锁。
幻读:
幻读指的是事务不是串行发生时发生的一种现象,是事务A读取了事务B已提交的新增数据。例如第一个事务对一个表的所有数据进行修改,同时第二个事务向表中插入一条新数据。那么操作第一个事务的用户就发现表中还有没有修改的数据行,就像发生了幻觉一样。解决幻读的方法是增加范围锁(range lock)或者表锁。四种事务隔离级别中只有SERIALIZABLE能够解决幻读。
MySQL的默认事务隔离级别是REPEATABLE_READ,ORACLE、SQL Server、DB2和PostgreSQL的默认事务隔离级别是READ_COMMITED。
事务ACID特性
事务的ACID特性分别指的是原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。
下面分别简述:
原子性:将一组操作组合成原子操作,只有所有操作都成功才算成功,否则只要有一个操作失败就全部失败
一致性:事务必须保证系统处于一致性状态,不管事务如何交织并发执行。必须保证下面几条:
-
如果一个操作触发了间接行为(CASCADE、TRIGGER等),那么间接行为也必须成功,否则事务失败
-
如果一个系统包含多个数据节点,那么一致性强制要求修改必须传播到所有节点
-
虽然事务可以并行执行,但系统就好像在串行执行事务一样,即与串行执行事务导致的最终系统状态是一样的
隔离性:隔离性保证一个事务中未提交的修改对外界不可见。隔离性通过锁机制达到。
持久性:一个成功的事务必须永久改变系统的状态,在事务执行结束之前状态改变被记录在事务日志中。这样万一系统崩溃或断电,未完成的事务也可以回放。