20200414——数据库 浅析Mysql的隔离级别 六

Mysql的四个隔离级别

预备工作

CREATE DATABASE testmmz;
create table account(
id int not null,
balance float not null,
 PRIMARY KEY ( id)
)

创建数据库

INSERT INTO account VALUE(1,1000);
INSERT INTO account VALUE(2,1000);

在这里插入图片描述

READ UNCOMMITTED(未提交读)

也即RU,在READ UNCOMMITTED级别,事务中的修改,即使没有提交,对其他事务也都是可见的。事务可以读取未提交的数据,这也被称为脏读(Dirty Read)。这个级别会导致很多问题,从性能上来说,READ UNCOMMITTED不会比其他的级别好太多,但却缺乏其他级别的很多好处,除非真的有非常必要的理由,在实际应用中一般很少使用。

A用户操作如下:

set SESSION TRANSACTION ISOLATION level READ UNCOMMITTED;
start TRANSACTION;
SELECT * from account;

在这里插入图片描述

B用户操作如下:

set SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
start TRANSACTION;
UPDATE account set balance = balance+200 where id = 1;

随后在A用户终端中查询数据,结果如下:
在这里插入图片描述

可以看到B用户并未提交事务,但是A用户却能读到未提交的数据,这就是脏读。

READ COMMITTED(提交读)
即RC,大多数数据库系统的默认隔离级别都是READ COMMTTED(但MySQL不是,Mysql的默认隔离级别是REPEATABLE READ)。READ COMMITTED满足前面提到的隔离性的简单定义:一个事务开始时,只能”看见”已经提交的事务所做的修改。换句话说,一个事务从开始直到提交之前,所做的任何修改对其他事务都是不可见的。这个级别有时候叫做不可重复读(nonrepeatble read),因为两次执行同样的查询,可能会得到不一样的结果。以例子说明:

我们将用户B所在的会话当前事务隔离级别设置为read commited。

那就是我们在会话B同一个事务中,读取到两次不同的结果。这就造成了不可重复读,就是两次读取的结果不同。

REPEATABLE READ(可重复读)
可重复读就解决了脏读和幻读

SERIALIZABLE(串行化)
SERIALIZABLE是最高的隔离级别。它通过强制事务串行执行,避免了前面说的幻读的问题。简单来说,SERIALIZABLE会在读取每一行数据都加锁,所以可能导致大量的超时和锁争用问题。实际应用中也很少用到这个隔离级别,只有在非常需要确保数据的一致性而且可以接受没有并发的情况下,才考虑采用该级别。

发布了983 篇原创文章 · 获赞 43 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/qq_36344771/article/details/105506784