mysql-事务隔离级别

246 阅读3分钟

参考链接

其他

  • 关于事务的相关操作
-- 查看事务是否 自动提交
show variables like "%autocommit%";

-- 设置事务的是否自动提交 0=OFF 1=ON
set  autocommit=0;

-- 查看msyql 事务的隔离级别
show variables like '%isolation%';

-- 查看全局的和 当前session的
select @@global.transaction_isolation, @@transaction_isolation;


--  修改全局事务隔离级别
set global transaction isolation level {事务隔离级别};
-- 修改当前会话的事务隔离级别
set session transaction isolation level {事务隔离级别};
  • InnoDB如何在RR隔离界别下避免幻读——next-key锁(行锁 和 GAP锁-间隙锁)

  • 事务的隔离级别 实际上都是定义了当前读的级别,为了减少锁处理的时间,引入了 快照读(不需要加锁,可能读到历史数据),而update,insert这些当前读,可能就需要加锁处理了。

  • 快照读(读取历史数据的方式)通常就是 select

  • 当前读,特殊的读操作,处理的数据都是当前数据,需要加锁

    • select * from xxx where ? lock in share mode;
    • select * from xxxx where ? for updates;
    • Insert/update/delete;

事务的隔离级别

隔离级别脏读不可重复读幻读
Read Uncommitted
读未提交
Read Committed
读已提交
Repeatable Read
可重复读
Serializable
可串行化
  • 脏读

当前事务读到了其他事务未提交的数据(脏数据),这种现象叫做脏读

  • 不可重复读

在该事务中,读取了其他事务提交的数据,导致前后读(select)取同一条数据不一致。

【不可重复读】和【脏读】的区别是:

不可重复读:读取了其他事务提交的数据

脏读:读取了其他事务未提交的数据

  • 幻读

在该事务中,前后两次记录数结果不一致

【幻读】和【不可重复读】区别

幻读:侧重于记录的 增长和删除现象

不可重复读:侧重于自己(自己的条件查询记录)的数据变化。

读未提交(Read Uncommitted)

  • 定义:

一个事务未提交时,它做的变更,被其他事务看到

  • 没有视图的概念

set session transaction isolation level read uncommitted;

show variables like "%isol%";

set autocommit = 0;

show variables like "%autocommit%";

A事务的修改后台,未提交,被B事务查询到了,属于脏数据

image-20211204210252075

读提交(Read Committed)

  • 定义:

一个事务做的变更只有他提交后,才可以被其他事务才看到。

  • MVCC视图创建时机:

会在每个语句前创建一个,所以在每次查询之前都会重新给予最新的数据,创建一个新的MVCC视图。

set session transaction isolation level read committed;

show variables like "%isol%";

set autocommit = 0;

show variables like "%autocommit%";

image-20211204213353564

可重复读(Repeatable Read)

mysql的默认的隔离级别

可重复读解决了幻读的问题,但是如果你不注意,就会读到 历史数据, 可以使用 Next-key锁(行锁和 GAP锁)来避免数据修改 和 插入造成问题。

  • 定义:

事务在执行过程中,看到的数据总是和启动时看到的数据是一致的(当前事务内的更新可以读到)

  • MVCC视图的创建时机:

在开始事务后,执行的第一条sql时,创建好了。这个视图会一直使用,直到该事务结束。

注意:A事务提交修改后的信息后,B事务再去更新,可能就会覆盖之前的A事务的值,所以在更新时候,加上更新字段的旧值

set session transaction isolation level repeatable read ;

show variables like "%isol%";

set autocommit = 0;

show variables like "%autocommit%";

image-20211205150043826

可串行化(Searializeble)

  • 定义

完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞

  • 没有视图概念,通过锁来实现数据访问。