MySQL 事务(二)

文章目录

  • 事务隔离性理论
    • 理解隔离性
    • 隔离级别
  • 事务隔离级别的设置和查看
  • 事务隔离级别
    • 读未提交
    • 读提交(不可重复读)

在这里插入图片描述

事务隔离性理论

  1. 理解隔离性
    MySQL服务可能会同时被多个客户端进程(线程)访问,访问的方式以事务方式进行
  2. 一个事务可能由多条SQL构成,也就意味着,任何一个事务,都有执行前,执行中,执行后的阶段。而所谓的原子性,其实就是让用户层要么看到执行前,要么看到执行后执行中出现问题,可以随时回滚。所以单个事务,对用户表现出来的特性,就是原子性。
  3. 但,毕竟所有事务都要有个执行过程,那么在多个事务各自执行多个SQL的时候,就还是有可能会出现互相影响的情况。比如:多个事务同时访问同一张表,甚至同一行数据。
  4. 数据库中,为了保证事务执行过程中尽量不受干扰,就有了一个重要特征:隔离性
  5. 数据库中,允许事务受不同程度的干扰,就有了一种重要特征:隔离级别

理解隔离性

  1. sql操作都是具有原子性的,update和select,谁先来谁就先跑
  2. 每一个人都只能看到自己活着时候世界所对应的样子,所以我们时间线一直在延展的时候,每个人看到的世界都应该是不一样的,这才符合自然规律,人与人之间具有隔离性,因此让每一个事务都看到最新的数据是不合理的,而是应该让每一个事务在他到来时看到他应该看到的数据。这就是隔离性的体现。
  3. 隔离性具体要隔离到什么程度,我们就有了隔离级别的概念
  4. 隔离性就是你可以看到你出生后的时间线的内容,不能看到你出生前的内容
  5. 隔离级别是你试衣服的时候要进试衣间,试鞋子就不用进试衣间

在这里插入图片描述

隔离级别

  1. 读未提交:在该隔离级别,所有的事务都可以看到其他事务没有提交的执行结果。(实际公司不会用这种),这种相当于没有隔离级别
  2. 读提交:一个事务commit之后,另一个事务可以看到这个事务的提交结果
  3. 可重复读:相当于一个事务做完操作后,另一个事务也做完操作后,两个事务都关闭后,重新启动事务才能看到结果,在操作的途中是看不到结果的,类比于两个小孩在浑浊的水中潜水,一个小孩要确认另一个小孩是否还在潜水要浮上水面才能知道结果,这是MySQL默认的隔离级别,在操作的途中看到的结果是相同的
  4. 串行化:事务最高的隔离级别,一个mysql执行完成后另一个mysql才能执行,会影响效率
  5. 隔离,基本都是通过锁实现的,不同的隔离级别,锁的使用是不同的

上面四种隔离级别关注的场景都是当有一个人在进行写的时候另一个人来读 (读写并发),读读的场景都用的是串行化,一个任务进行完才能进行下一个任务

事务隔离级别的设置和查看

1. 只影响当前事务的隔离级别,mysql会默认使用session的隔离级别
2. 全局的隔离级别对所有的事务都影响,全局的改了,当前会话的和另一个事务的都会改变(在重新登入后更改)

SELECT @@session.tx_isolation; 
--查看会话(当前)全局隔级别(默认用全局的初始化)
set global transaction isolation level READ UNCOMMITTED; 
-- 查看 
mysql> SELECT @@global.tx_isolation; 
--查看全局隔级别 
+-----------------------+ 
| @@global.tx_isolation | 
+-----------------------+ 
| REPEATABLE-READ       | 
+-----------------------+ 
1 row in set, 1 warning (0.00 sec) mysql> SELECT @@session.tx_isolation; 
--查看会话(当前)全局隔级别(默认用全局的初始化)
+------------------------+ 
| @@session.tx_isolation | 
+------------------------+ 
| REPEATABLE-READ        | 
+------------------------+ 
1 row in set, 1 warning (0.00 sec) mysql> SELECT @@tx_isolation; 
--默认同上,跟上面的一个是同一个意思 
+-----------------+ 
| @@tx_isolation  | 
+-----------------+ 
| REPEATABLE-READ |
+-----------------+ 
1 row in set, 1 warning (0.00 sec) --设置 
-- 设置当前会话 or 全局隔离级别语法 
// transaction 事务
// isolation 隔离
SET [SESSION | GLOBAL] transaction isolation  level
// 读可不可提交,读可提交,可重复读,串行化
{READ UNCOMMITTED | READ COMMITTED | 
REPEATABLE READ | SERIALIZABLE} --设置当前会话隔离性,另起一个会话,看不多,只影响当前会话 
mysql> set session transaction isolation level serializable; -- 串行化 
Query OK, 0 rows affected (0.00 sec) mysql> SELECT @@global.tx_isolation; --全局隔离性还是RR 
+-----------------------+ 
| @@global.tx_isolation | 
+-----------------------+ 
| REPEATABLE-READ       | 
+-----------------------+ 
1 row in set, 1 warning (0.00 sec) mysql> SELECT @@session.tx_isolation; --会话隔离性成为串行化 
+------------------------+ 
| @@session.tx_isolation | 
+------------------------+ 
| SERIALIZABLE           | 
+------------------------+ 
1 row in set, 1 warning (0.00 sec) mysql> SELECT @@tx_isolation; --同上 
+----------------+ 
| @@tx_isolation | 
+----------------+ 
| SERIALIZABLE   | 
+----------------+ 
1 row in set, 1 warning (0.00 sec) --设置全局隔离性,另起一个会话,会被影响 
mysql> set global transaction isolation level READ UNCOMMITTED; 
Query OK, 0 rows affected (0.00 sec) mysql> SELECT @@global.tx_isolation; 
+-----------------------+ 
| @@global.tx_isolation | 
+-----------------------+ 
| READ-UNCOMMITTED      | 
+-----------------------+ 
1 row in set, 1 warning (0.00 sec) mysql> SELECT @@session.tx_isolation; 
+------------------------+ 
| @@session.tx_isolation | 
+------------------------+
| READ-UNCOMMITTED       | 
+------------------------+ 
1 row in set, 1 warning (0.00 sec)mysql> SELECT @@tx_isolation; 
+------------------+ 
| @@tx_isolation   | 
+------------------+ 
| READ-UNCOMMITTED | 
+------------------+ 
1 row in set, 1 warning (0.00 sec)-- 注意,如果没有现象,关闭mysql客户端,重新连接。

设置当前事务的隔离级别为读提交

在这里插入图片描述

事务隔离级别

读未提交

  1. 脏读:一个事务在执行中,读到另一个执行中事务的更新(或其他操作)但是未commit的数据,两个事务并发执行
  2. 几乎没有加锁,虽然效率高,但是问题太多,严重不建议采用
--终端A 
-- 设置隔离级别为 读未提交 
mysql> set global transaction isolation level read uncommitted; 
Query OK, 0 rows affected (0.00 sec) --重启客户端
mysql> select @@tx_isolation;
+------------------+
| @@tx_isolation   | 
+------------------+ 
| READ-UNCOMMITTED | 
+------------------+ 
1 row in set, 1 warning (0.00 sec)mysql> select * from account;
+----+--------+----------+
| id | name   | blance   | 
+----+--------+----------+ 
| 1  | 张三   | 100.00   | 
| 2  | 李四   | 10000.00 | 
+----+--------+----------+ 
2 rows in set (0.00 sec) mysql> begin;                   --开启事务 
Query OK, 0 rows affected (0.00 sec)mysql> update account set blance=123.0 where id=1;  --更新指定行 
Query OK, 1 row affected (0.05 sec) 
Rows matched: 1  Changed: 1  Warnings: 0--没有commit哦!!!--终端B mysql> begin;
mysql> select * from account;
+----+--------+----------+ 
| id | name   | blance   | 
+----+--------+----------+ 
| 1 | 张三    | 123.00   | --读到终端A更新但是未commit的数据[insert,delete同样] 
| 2 | 李四    | 10000.00 | 
+----+--------+----------+ 
2 rows in set (0.00 sec) 

读提交(不可重复读)

在这里插入图片描述

-- 终端A 
mysql> set global transaction isolation level read committed; 
Query OK, 0 rows affected (0.00 sec) 
--重启客户端 
mysql> select * from account; --查看当前数据 
+----+--------+----------+ 
| id | name   | blance   | 
+----+--------+----------+ 
| 1  | 张三   | 123.00   | 
| 2  | 李四   | 10000.00 | 
+----+--------+----------+ 
2 rows in set (0.00 sec) mysql> begin; --手动开启事务,同步的开始终端B事务 
Query OK, 0 rows affected (0.00 sec) mysql> update account set blance=321.0 where id=1; --更新张三数据 
Query OK, 1 row affected (0.00 sec) 
Rows matched: 1 Changed: 1 Warnings: 0 --切换终端到终端B,查看数据。 mysql> commit; --commit提交! 
Query OK, 0 rows affected (0.01 sec) --切换终端到终端B,再次查看数据。 --终端B 
mysql> begin; --手动开启事务,和终端A一前一后 
Query OK, 0 rows affected (0.00 sec) mysql> select * from account; --终端A commit之前,查看不到 
+----+--------+----------+ 
| id | name   | blance   | 
+----+--------+----------+ 
| 1  | 张三   | 123.00   | --老的值 
| 2  | 李四   | 10000.00 | 
+----+--------+----------+ 
2 rows in set (0.00 sec) --终端A commit之后,看到了!
--but,此时还在当前事务中,并未commit,那么就造成了,同一个事务内,同样的读取,在不同的时间段(依旧还在事务操作中!),读取到了不同的值,这种现象叫做不可重复读(non reapeatable read)!!(这个是问题吗??) 
mysql> select *from account; 
+----+--------+----------+ 
| id | name   | blance   | 
+----+--------+----------+ 
| 1  | 张三   | 321.00   |  --新的值 
| 2  | 李四   | 10000.00 | 
+----+--------+----------+ 
2 rows in set (0.00 sec) 

不可重复读会出现什么问题呢?
两个事务都同时启动,一个事务提交了(关闭了),另一个运行的事务(查询)看到第一个事务的提交结果是不合理的,两个事务都应该是原子的

不可重复读会造成问题吗?会造成什么后果?
比如说小王要把tom的工资重3200改到4500,而小张负责工资表发放奖品的任务,小张要进行查询的任务,当事务运行到3000到4000奖品的查询时,查到了tom,之后小王提交了事务,在4000到5000奖品的查询时,又查到了tom,这在公司就出现了问题

在这里插入图片描述
所以我们不应该让我们的用户在实际操作的时候,两个正在执行的事务一方能够读到另一方的提交。所以虽然读提交比读未提交隔离级别高,但是我们也不推荐!因为会导致上述的不可重复读的问题!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/80808.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码仓提交分支规范

以下是我部门开发时用的分支规范,参考于Linux社区 Tips 分支命名通常遵循一些最佳实践和规则,以便使分支的用途和内容清晰易懂,就在写一个文档的主题一样。 功能分支 (Feature Branches) 用于开发新功能。 命名格式:feature/功能名…

Google Earth Engine(GEE) 代码详解:批量计算_年 NDVI 并导出(附 Landsat 8 数据处理全流程)

一、代码整体目标 基于 Landsat 8 卫星数据,批量计算 2013-2020 年研究区的 NDVI(归一化植被指数),实现去云处理、数据合成、可视化及批量导出为 GeoTIFF 格式,适用于植被动态监测、生态环境评估等场景。 二、代码分步解析(含核心原理与易错点) 1. 加载并显示研究区边…

Maven 处理依赖冲突

Maven处理依赖冲突 什么是依赖冲突?如何解决?Maven自动处理依赖冲突的规则路径优先原则第一声明优先原则注意 子模块覆盖父模块父模块声明dependency子模块覆盖dependency父模块声明dependencyManagement 子模块覆盖dependency父模块声明dependencyManag…

docker 安装 sqlserver2022 和注意点

一、前言 1、可以直接参考微软官方文档 快速入门:使用 Docker 运行 SQL Server Linux 容器映像,这里主要是说一些注意点和坑 二、安装 1、拉取镜像 docker pull mcr.microsoft.com/mssql/server:2022-latest2、创建挂载目录,这里只是比官方…

Dagster Pipes系列-1:调用外部Python脚本

本文是"Dagster Pipes教程"的第一部分,介绍如何通过Dagster资产调用外部Python脚本并集成到数据管道中。首先,创建Dagster资产subprocess_asset,利用PipesSubprocessClient资源执行外部脚本external_code.py,实现跨进程…

【SQL系列】多表关联更新

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

C++进阶学习:STL常用容器--map/multimap容器

1. map 容器基本概念 map 中所有元素都是 pair pair 中第一个元素为 key (键值) 起到索引运用 第二个元素为 value(实值) 所有元素都会根据元素的键值自动排序 本质: map/multimap 属于关联式容器 底层结构是用二…

let,const,var关键字的区别

let,const,var关键字 let,const,var都存在变量提升 它们都存在变量提升但是稍微有点不同 var变量声明会被提升到作用域的顶部,并且会被初始化为 undefinedlet 和 const:变量声明也会被提升到作用域的顶部,但不会被初…

Nuitka 已经不再安全? Nuitka/Cython 打包应用逆向工具 -- pymodhook

pymodhook是一个记录任意对Python模块的调用的库,用于Python逆向分析。 pymodhook库类似于Android的xposed框架,但不仅能记录函数的调用参数和返回值,还能记录模块的类的任意方法调用,以及任意派生对象的访问,基于pyob…

path环境变量满了如何处理,分割 PATH 到 Path1 和 Path2

要正确设置 Path1 的值,你需要将现有的 PATH 环境变量 中的部分路径复制到 Path1 和 Path2 中。以下是详细步骤: 步骤 1:获取当前 PATH 的值 打开环境变量窗口: 按 Win R,输入 sysdm.cpl,点击 确定。在 系…

SEMI E40-0200 STANDARD FOR PROCESSING MANAGEMENT(加工管理标准)-(一)

1 目的 物料(例如晶圆)加工在设备中的自动化管理与控制是实现工厂自动化的关键要素。本标准针对半导体制造环境中与设备内部物料处理相关的通信需求进行了规范。本标准规定了在加工单元接收到的指定材料所应适用的加工方法(例如Etch腔室需要Run哪支Recipe)。它阐述了物料加工的…

【Hadoop】集群搭建实战:超详细保姆级教程

🐇明明跟你说过:个人主页 🏅个人专栏:《大数据前沿:技术与应用并进》🏅 🔖行路有良友,便是天堂🔖 目录 一、引言 1、Hadoop简介 2、Hadoop集群概念 3、 Hadoop 集…

阿里云人工智能大模型通义千问Qwen3开发部署

本文主要描述阿里云人工智能大模型开源社区ModelScope提供的通义千问Qwen3开发部署。 与阿里云一起 轻松实现数智化 让算力成为公共服务:用大规模的通用计算,帮助客户做从前不能做的事情,做从前做不到的规模。让数据成为生产资料:…

24.(vue3.x+vite)引入组件并动态挂载(mount)

示例截图 组件代码: <template><div><div>{{message }}</div>

《Python星球日记》 第56天:循环神经网络(RNN)入门

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、序列数据的特点与挑战1. 什么是序列数据?2. 序列数据的挑战二、RNN 的基本结构与前向传播1. RNN的核心理念2. RNN的数学表达3. RNN的前向传…

手写 vue 源码 === computed 实现

目录 计算属性的基本概念 计算属性的核心实现 ComputedRefImpl 类的实现 ReactiveEffect 与计算属性的关系 计算属性的工作流程 1. 创建计算属性 2. 依赖收集过程 3. 嵌套 effect 的处理 4. 更新过程 嵌套 effect 关系图解 依赖关系建立过程 代码实现分析 1. 创建…

【Lattice FPGA 开发】Diamond在线调试Reveal逻辑乱跳的解决

在Vivado中在always块中写逻辑时如果出现always块中的异步复位敏感词在块内部未使用的情况&#xff0c;如下例的rst&#xff1a; always (posedge clk or posedge rst) begin if(~tx_sense_flag)o_rd_adr < d1;else if((o_rd_adr d94) & (bit_cnt d7))o_rd_adr <…

【hadoop】Sqoop数据迁移工具的安装部署

一、Sqoop安装与配置 步骤&#xff1a; 1、使用XFTP将Sqoop安装包sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz发送到master机器的主目录。 2、解压安装包&#xff1a; tar -zxvf ~/sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz 3、修改文件夹的名字&#xff0c;将其改为s…

BUUCTF——PYWebsite

BUUCTF——PYWebsite 进入靶场 看看基本信息 没有什么信息 扫个目录看看 http://node5.buuoj.cn:28115/.DS_Store http://node5.buuoj.cn:28115/flag.php http://node5.buuoj.cn:28115/index.html访问flag.php 提示保存购买者的IP 抓包看看 直接XFF伪造一下 X-Forwarded-F…

基于Qt开发的多线程TCP服务端

目录 一、Qt TCP服务端开发环境准备1. 项目配置2. 核心类说明二、服务端搭建步骤详解步骤1:初始化服务端对象步骤2:启动端口监听步骤3:处理客户端连接三、数据通信与状态管理1. 数据收发实现2. 客户端状态监控四、进阶功能扩展1. 多客户端并发处理2. 心跳检测机制五、调试与…