mysql 事务隔离级别

浩客2年前技术文章678

一、事务隔离级别介绍

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

  • 事务隔离级别

     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会一直等待。


相关文章

A集群导入B集群中的高可用版rancher

A集群导入B集群中的高可用版rancher

问题现象:已知在B集群中采用helm方式部署了一个高可用版本的rancher,该rancher中已经配置导入了三套集群,并且三套集群状态在rancher控制台处均显示正常,日常可借助该rancher管...

爬坑记录------容器内外网络不通,端口无法访问

爬坑记录------容器内外网络不通,端口无法访问

背景:客户需要一套datahub用于分许sparksql血缘,因此需要基于docker搭建,在搭建过程中遇到一个较坑的问题,这里做以记录搭建完成后查看docker容器已经正常启动查看红框中的内容信息,...

大数据监控系列(一)——Prometheus+Grafana监控概述

大数据监控系列(一)——Prometheus+Grafana监控概述

1 概述这是介绍Prometheushe和Grafana主要是为了监控大数据产品,数栈平台也是使用Prometheushe+Grafana作为底层大数据组件的监控,并且均有配置模板,导入即在Grafa...

C++ 编程:数组的定义

1. 什么是数组?数组让能够按顺序将一系列相同类型的数据存储到内存中 C++ 中的数组可分为静态数组 与 动态数组 两种。2. 静态数组首先介绍声明一个 静态数组 的语法:/* ElementType...

开源大数据集群部署(十九)Hbase部署

开源大数据集群部署(十九)Hbase部署

2.8 HBASE 安装部署hbase组件部署主机HMasterhd1.dtstack.comhd2.dtstack.comHRegionServerhd3.dtstack.com,hd2.dtsta...

lru_cache 缓存

Python 语法: @functools.lru_cache(maxsize=128, typed=False)Least-recently-used 装饰器。Iru 最近最少使用、cache 缓存...

发表评论    

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