mysql 事务隔离级别

浩客2年前技术文章584

一、事务隔离级别介绍

  • 多个连接开启各自事务操作数据库中数据时,数据库系统要负责隔离操作,以保证各个连接在获取数据时的准确性。

  • 事务隔离级别

     MySQL隔离级别定义了事务与事务之间的隔离程度  

1.png

二、不考虑隔离性,可能会引发如下问题

  • 脏读( dirty read ):当一个事务读取另一个事务尚未提交的改变(update,insert,delete)时,产生脏读

  • 不可重复读( nonrepeatable read ):同一查询在同一事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集,此时发生不可重复读。

  • 幻读( phantom read ):同一查询在同一事务中多次进行,由于其他提交事务所做的插入操作,每次返回不同的结果集,此时发生幻读。

三、演示MySQL的事务隔离级别

1、读未提交(READ UNCOMMITTED)

(1)、脏读

-- 1. 开了两个 mysql 的控制台
-- 2. 查看当前 mysql 的隔离级别
SELECT @@tx_isolation;

-- 3.把其中一个控制台的隔离级别设置 Read uncommitted
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

2.png

--控制台1
--开启事务
start transaction;
use haoke;
CREATE TABLE `account`(
id INT, `name` VARCHAR(32), money INT);
insert into account value(100,'hawk',1000);

--控制台2
--开启事务
start transaction;
use haoke;
select * from account;

3.png

控制台1的事务还未提交,控制台2就查到数据,这就是脏读。

(2)、不可重复读、幻读(基于以上继续操作)

--控制台1
update account set money = 800 where id=100;
insert into account values(200,'jack',2000);
--提交事务
commit;

--控制台2
select * from account;

4.png

  • 控制台2的事务还未commit,由于控制台1的提交影响了控制台2对表数据的读取,就产生了不可重复读、幻读。

  • 通俗的说,就是当两个事务A、B连接到数据的同一表时,希望所能读取到的数据就是在事务连接到表(开启事务)这一时刻的数据

2、读已提交(READ COMMITTED)

--把其中一个控制台2的隔离级别设置 Read committed
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;

5.png

  • 读已提交不会产生脏读

6.png

  • 读已提交的隔离级别下产生不可重复读和幻读

3、可重复读(Repeatable read)

7.png

  • 可重复读不会产生脏读

8.png

  • 可重复读的隔离级别下不会产生不可重复读和幻读

4、可串行化(Serializable)

两个事务A、B,当事务A在操作表时且事务A未commit,此时,当事务B试图操作表时,会检查事务A是否commit,如果A未commit,事务B会一直等待。


相关文章

flink单task多slot调优

flink单task多slot调优

1. 单taskmanager多slot的设置方法方式一:在配置文件中配置taskmanager.numberOfTaskSlots,通过修改提交任务的客户端配置文件中的配置flink-co...

MySQL gh-ost DDL 变更工具

MySQL gh-ost DDL 变更工具

1. MDL 锁介绍MySQL 的锁可以分为四类:MDL 锁、表锁、行锁、GAP 锁,其中除了 MDL 锁是在 Server 层加的之外,其它三种都是在 InnoDB 层加的。下面主要介绍一下:MDL...

docker日志切割

docker日志切割

如果在docker部署前期没有规划好,例如:没有提前配置容器日志切割,那么在后期容器日志就会越来越大,当想要通过日志查看相关报错等信息的时候就会比较麻烦。配置docker日志切割在/etc/docke...

tomcat目录和配置文件介绍

一、tomcat目录说明tomcat主目录bin:命令,存放不同平台上启动或关闭的脚本BUILDING.txt&RUNNING.txt:使用文档,告诉用户如何搭建conf:各种全局配置文件,最...

日志聚合工具loki

1、loki是什么Loki是一个水平可扩展,高可用性,多租户的日志聚合系统,受到Prometheus的启发。它的设计非常经济高效且易于操作,因为它不会为日志内容编制索引,而是为每个日志流编制一组标签。...

linux中的buffer和cache

linux中的buffer和cache

linux中的buffer和cache一、buffer和cache的来源及应用1、来源Buffer 是缓冲区,而 Cache 是缓存,两者都是数据在内存中的临时存储。那么,这两种“临时存储”有什么区别...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。