Mysql的4种事务隔离级别详解

为君一笑 提交于 2019-11-30 01:58:25

sql标准定义了4种隔离级别,包含了一些具体规则,用来限定事物内外的那些变化是可见的,哪些是不可见的。

低级别的隔离级一般支持更高的并发处理,拥有更低的系统开销。

1到4,4种隔离级别:

Read Uncommitt(读取未提交的内容)

Read Conmmitted(读取提交内容)

Repeatable read(可重读)

Serializable(可串行化)

查看事物隔离级别命令:

SELECT @@tx_isolation;

修改事物隔离级别命令:

set tx_isolation='read_committed'

脏读的含义:读取到未提交的数据。

新建一个表:

CREATE TABLE tes(
id INT PRIMARY KEY,
num INT
)

INSERT INTO tes VALUES(1,1),(2,2),(3,3);

启动一个事物修改事物级别为第一级别运行:

start transaction;

SELECT *FROM tes 

再启动一个事物修改表中的数据:

start transaction;
update tes set num=10 where id=1;
select * from tes;
ROLLBACK;
SELECT *FROM tes;

再在第一个事物中查询:

在第二个事物没有提交的情况下,第一个事物得到了第二个事物修改后的数据。

如果在第二个事物回滚后,第一个事物读到的数据又回到未修改的状态

这样就称为脏锁。

第一级别:Read Uncommitt(读取未提交的内容)
1.所有事物都可以看到其他未提交事物的执行结果。
2.该级别较少用于实际场景,性能没有优势。
3.会进行脏读,读取到未提交的数据。

 

第二级别:Read Conmmitted(读取提交内容)
1.大多数数据库系统的默认隔离级别(不是MySql默认级别)。
2.满足了单隔离的简单定义,一个事物只能看见已经提交事物的改变。
3.该隔离级别不可重复读(Nonrepeatable Read);不可重复读意味着我们在同一个事务中执行完全相同的select语句时可能看到不一样的结果。


第三级别:Repeatable read(可重读)
1.这是MySQL的默认事务隔离级别
2.它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行
3.此级别可能出现幻读(Phantom Read):用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行.
4.InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题

 

第4级别:Serializable(可串行化)
1.这是最高的隔离级别
2.它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。
3.在这个级别,可能导致大量的超时现象和锁竞争

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!