MySQL隔离级别


概念

MySQL四种隔离级别:

  • READ UNCOMMITTED (未提交读)
  • READ COMMITTED (提交读)
  • REPEATABLE READ (可重复读)
  • SERIALIZABLE (可串行化)

脏读、不可重复读、幻读

  • 脏读:事务可读取其他事务未提交的数据
  • 不可重复读:事务A读取事务B修改的数据,在事务B提交前和提交后事务A读取的数据可能不一致
  • 幻读:当某个事务在读取某个范围内的记录时,另外一个事务又在该范围内插入新的记录,当之前的事务再次读取该范围内的记录时,会产生幻行。

一、环境准备

  • MySQL8.0
  • 数据表
    • sql语句如下(示例):
select @@transaction_isolation; // 查看当前的隔离级别
CREATE DATABASE test;
USE test;

CREATE TABLE user(
id int primary key auto_increment,
age int);

二、隔离级别

1.READ UNCOMMITTED (未提交读)

存在脏读情况

脏读情况如下(示例):

事务1事务2
truncate user;
set session transaction isolation level READ UNCOMMITTED;set session transaction isolation level READ UNCOMMITTED;
insert into user values(1,10),(2,10),(3,10),(4,10),(5,10);
start transaction;
start transaction;
select * from user where id=1; 在这里插入图片描述
update user set age=age+1 where id=1;
select * from user where id=1;在这里插入图片描述
commit;
commit;

2.READ COMMITTED (提交读)

解决了脏读问题,存在不可重复读情况

不可重复读情况如下(示例):

事务1事务2
truncate user;
set session transaction isolation level READ COMMITTED;set session transaction isolation level READ COMMITTED;
insert into user values(1,10),(2,10),(3,10),(4,10),(5,10);
start transaction;
start transaction;
select * from user where id=1; 在这里插入图片描述
update user set age=age+1 where id=1;
select * from user where id=1; 在这里插入图片描述
commit;
select * from user where id=1;在这里插入图片描述
commit;
commit;

3.REPEATABLE READ (可重复读)

解决了脏读和不可重复读。存在幻读情况。

幻读情况如下(示例):

事务1事务2
truncate user;
set session transaction isolation level REPEATABLE READ;set session transaction isolation level REPEATABLE READ;
insert into user values(1,10),(2,10),(3,10),(4,10),(5,10);
start transaction;
start transaction;
select * from user where id<10;
select * from user where id=8;在这里插入图片描述
insert into user value(8,10);
commit;
select * from user where id=8;
update user set age=age+1;
select * from user where id=8;
select * from user where id<10;在这里插入图片描述
commit;

4.SERIALIZABLE (可串行化)

最严格的隔离级别,它通过强制事务串行执行,避免上述的幻读问题。上述例子中的事务2的insert into将会一直锁住,直到事务1提交或回滚。

总结

隔离级别脏读可能性不可重复读可能性幻读可能性加锁读
READ UNCOMMITTEDYesYesYesNo
READ COMMITTEDNoYesYesNo
REPEATABLE READNoNoYesNo
SERIALIZABLENoNoNoYes

参考资料

  • 《高性能MySQL第三版》
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值