mysql的innodb存储引擎事务隔离级别
innodb存储引擎支持数据库事务,事务有四大特性ACID:
原子性 Atomicity
一致性 Consistency
持久性 Durability
隔离性 isolation
隔离级别 | 脏读 | 不可重复读 | 幻读 | |
1 | Read uncommitted 未提交读 | 可能 | 可能 | 可能 |
2 | Read committed 已提交读 | —— | 可能 | 可能 |
3 | Repeatable read 可重复读 | —— | —— |
—— 幻读是怎么解决的?在快照下面,是用MVCC解决的,在LBCC(Locked Base Concurrency Control)锁定读或当前读的情况下,是用间隙锁gap锁来解决的。 |
4 | Serializable 可序列化 | —— | —— | —— |
事务隔离级别:
1) Read uncommitted 未提交读。脏读。事务2读到事务1已更改但未提交的数据
2) Read committed 读已提交。可重复读。事务2要等事务1提交后才能读取数据。 同一个线程在一个事务过程中相同查询SQL,前后返回了其他线程事务提交前和提交后两种不同的值
3) Repeatable read 可重复读。
4) Serializable 可序列化。 是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。
备注:在mysql中,不可重复读 和 幻读 在 “Read uncommitted” 和 “Read committed” 两种隔离级别中都可能出现。
【不可重复读】
当事务内相同的记录被检索两次,且两次得到的结果不同时,此现象为不可重复读。比如在事务1的开始之后结束之前,事务2做了begin和commit的update操作,这时候事务1在前后两次读取就会得到不同结果值。
【Phantom reading 幻读】
幻读是读取到了之前没有读取到的记录。幻读对应的问题是insert操作,而不是update操作。 对于delete操作,SQL92标准里视为幻读,但在mysql官方认为它不是幻读,认为是发生了被删除记录的不可重复读。 比如事务1开始之后读到一个数据,然后事务2去insert了一条数据,此后事务1就会读到两条数据,读到了之前没有的记录,称之为幻读。
show variables like 'transaction_isolation'; 执行该SQL可获得mysql的默认事务级别: REPEATABLE-READ
参考 《理解事务的4种隔离级别》
end.