保护私人版权,尊重他人版权。转载请注明出处并附带页面链接
事务四大特征(ACID)
原子性(A):事务是最小单位,不可再分, 要么都做要么都不做=> 通过undo log保证
一致性(C):指的是逻辑上的一致性,当事务完成时,必须使所有数据都具有一致的状态。相当于能量守恒定律。
隔离性(I) :事务A和事务B之间不可见。为了有效保证并发读取数据的正确性
持久性(D):是事务的保证,事务终结的标志(内存的数据持久到硬盘文件中) => redo log保证
事务四大特性之一————隔离性(isolation)
一、隔离级别(4个)
- 读未提交(read uncommitted ): 事务A能读到事务B未提交的数据。不会采用任何锁。
- 读已提交(read committed):事务A能读到事务B提交的数据。读不加锁,数据的增删改加锁,避免脏读
- 可重复读(repeatable read):读写加锁, 一个事务内多次查询得到相同的结果,对相同数据行事务A必须等待事务B释放锁后才能操作
- 串行化(serializable):表锁,事务A与事务B串行,吞吐量低
二、InnoDB默认级别:可重复读
三、并发事务异常:
- 脏读(dirty read):一个事务可以读取另一个尚未提交事务的修改数据。
- 不可重复读(nonrepeatable read):在同一个事务中,如果数据被其他事务修改,不能重复读取该记录原始值。
- 幻读(phantom read):在同一事务中,同一查询多次进行时候,由于其他插入操作(insert)的事务提交,导致每次返回不同的结果集。
- 丢失更新(覆盖丢失):一个事务的提交覆盖了另一个事务提交的修改。
- 脏写(回滚丢失):一个事务的回滚覆盖了另一个事务提交的修改
隔离级别 | 脏读 | 不可重复读 | 幻读 | 丢失更新 | 脏写 |
---|---|---|---|---|---|
未提交读 | 可能 | 可能 | 可能 | 可能 | 不可能 |
已提交读 | 不可能 | 可能 | 可能 | 可能 | 不可能 |
可重复读 | 不可能 | 不可能 | 可能 | 不可能 | 不可能 |
串行化 | 不可能 | 不可能 | 不可能 | 不可能 | 不可能 |
注意:
- read committed:不可以杜绝幻象读.
- serializable: 当没有开启autocommit,InnoDB会将select转换为 SELECT … LOCK IN SHARE MODE(加S锁).如果开启autocommit,那么和普通事务中的select一样为一致性非锁定读.
- repeatable read: 支持next-key,可以避免换读现象的发生.
在快照读读情况下,mysql通过mvcc来避免幻读。
在当前读读情况下,mysql通过next-key来避免幻读。
select * from t where a=1;属于快照读
select * from t where a=1 lock in share mode;属于当前读