mysql的innodb存储引擎事务隔离级别

innodb存储引擎支持数据库事务,事务有四大特性ACID:
原子性 Atomicity
一致性 Consistency
持久性 Durability
隔离性 isolation

mysql事务隔离表
  隔离级别 脏读 不可重复读 幻读
1 Read uncommitted    未提交读 可能 可能 可能
2 Read committed    已提交读 —— 可能 可能
3 Repeatable read   可重复读 —— ——

——
在mysql中已基本解决幻读问题。

幻读是怎么解决的?在快照下面,是用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.

posted on 2021-06-06 10:53  梦幻朵颜  阅读(169)  评论(0编辑  收藏  举报