MySQL事务隔离级别

2021-09-26  本文已影响0人  修伊Dal

事务的四种要素(ACID)

事务的并发问题

当多个事务同时在数据库上执行时,就有可能出现以下这些事务的并发问题。

幻读专指新插入的数据行,不可重复读侧重于对原有数据的修改。

事务的隔离级别

为了解决上面的事务的并发问题,于是就有了以下隔离级别的概念。

事务的隔离级别 脏读 不可重复读 幻读
读未提交(read uncommitted) Y Y Y
读已提交(read committed) N Y Y
可重复读(repeatable read) N N Y
串行化(serializable) N N N

这张表是事务的4种隔离级别以及在这种隔离界别下会出现的并发问题。

MySQL的默认隔离级别是可重复读。
查看当前session隔离级别命令:select @@tx_isolation;

为了方便演示,使用的测试表如下:

create table t
(
    id int not null
        primary key,
    c  int null,
    d  int null
);

create index c
    on t (c);

insert into t values(0,0,0),(5,5,5),
(10,10,10),(15,15,15),(20,20,20),(25,25,25);

读未提交(read uncommited)

设置当前事务为读未提交命令:

set session transaction isolation level read uncommitted;

假设:

sessionA sessionB
T1 begin;
T2 select * from t;result:(0,0,0),(5,5,5),(10,10,10),(15,15,15),(20,20,20),(25,25,25)
T3 begin;
T4 update t set c = c + 5 where id = 5;
T5 select * from t;result:(0,0,0),(5,10,5),(10,10,10),(15,15,15),(20,20,20),(25,25,25)
T6 rollback;
T7 select * from t;result:(0,0,0),(5,5,5),(10,10,10),(15,15,15),(20,20,20),(25,25,25)

读已提交(read committed)

设置当前事务为读已提交命令:

set session transaction isolation level read committed;

例如:

sessionA sessionB
T1 begin;
T2 select * from t;result:(0,0,0),(5,5,5),(10,10,10),(15,15,15),(20,20,20),(25,25,25)
T3 begin;
T4 update t set c = c + 5 where id = 5;
T5 select * from t;result:(0,0,0),(5,5,5),(10,10,10),(15,15,15),(20,20,20),(25,25,25)
T6 commit;
T7 select * from t;result:(0,0,0),(5,10,5),(10,10,10),(15,15,15),(20,20,20),(25,25,25)

可重复读(repeatable read)

设置当前事务为可重复读命令:

set session transaction isolation level repeatable read;

例如:

sessionA sessionB
T1 begin;
T2 select * from t;result:(0,0,0),(5,5,5),(10,10,10),(15,15,15),(20,20,20),(25,25,25)
T3 begin;
T4 update t set c = c + 5 where id = 5;
T5 select * from t;result:(0,0,0),(5,5,5),(10,10,10),(15,15,15),(20,20,20),(25,25,25)
T6 commit;
T7 select * from t;result:(0,0,0),(5,5,5),(10,10,10),(15,15,15),(20,20,20),(25,25,25)
T8 commit;
T9 select * from t;result:(0,0,0),(5,10,5),(10,10,10),(15,15,15),(20,20,20),(25,25,25)

串行化(serializable)

设置当前事务为串行化命令:

set session transaction isolation level serializable;

示例:

sessionA sessionB
T1 begin;
T2 select * from t for update;result:(0,0,0),(5,5,5),(10,10,10),(15,15,15),(20,20,20),(25,25,25)
T3 insert into t (id, c, d) values (6, 10, 6);(blocked)

可重复读怎么解决不可重复读问题

读已提交隔离级别和可重复读隔离级别下事务的视图生成是不同的。

上一篇 下一篇

猜你喜欢

热点阅读