0%

MySQL四种隔离级别

四种隔离级别

  • 未提交读:READ UNCOMMITTED
  • 提交读:READ COMMITTED
  • 可重复读(默认):REPEATABLE READ
  • 可序列化:SERIALIZABLE

设置隔离级别:set session transaction isolation level read uncommitted;

未提交读(read uncommitted)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
set session transaction isolation level read uncommitted;
# 会话一
set autocommit = 0;

update student
set name = 'hello'
where id = 1;

rollback; # 如果执行回滚


# 会话二
select * from student; # 会看到已经更改的name,发生脏读
# 如果会话一的事务回滚,再执行。
select * from student; # 会发现name恢复原值

发生脏读

提交读(read committed)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
set session transaction isolation level read committed;
# 会话一
set autocommit = 0;

update student
set name = 'hello'
where id = 1;

commit; # 提交事务

# 会话二
select * from student; # 无法看到会话一修改后的name
# 如果会话一的事务提交,再执行。
select * from student; # 会发现name的值发生更改。得到两次不同的结果

可以避免脏读,但是发生不可重复读

可重复读(repeatable read)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
set session transaction isolation level repeatable read;
# 会话一
set autocommit = 0;

update student
set name = 'hello'
where id = 1;

commit; # 提交事务

# 会话二
set autocommit = 0; # 开启事务
select * from student; # 无法看到会话一修改后的name
# 如果会话一的事务提交,再执行。
select * from student; # 无法看到会话一修改后的name
commit; # 提交事务后再查询
select * from student; # 会发现name的值发生更改

可以避免脏读不可重复读,但是无法避免幻读

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
set session transaction isolation level repeatable read;
# 会话一
set autocommit = 0;

select * from student; # 6行数据

update student set name = 'hhh'; # 等待会话一的事务提交后,执行。
# 出现:7 rows affected

# 会话二
set autocommit = 0;

select * from student; # 6行数据

insert into student value (... ...); # 插入一行数据

commit;

发生幻读(即出现了新的数据)

可串行化(serializable)

事务的串行执行。即一个事务提交后,另一个事务的操作才能执行,否则发生阻塞。

本文标题:MySQL四种隔离级别

文章作者:SkecisAI

发布时间:2020年09月12日 - 15:33:27

最后更新:2020年09月12日 - 16:18:59

原始链接:http://www.skecis.top/2020/09/12/mysql隔离级别/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

感谢你的支持,希望本文能助你一臂之力。