【MySQL | 八、 事务管理】
文章目录
- 什么是事务?
- 事务的特性:
- 事务的意义
- 事务的提交
- 查看事务提交方式
- 事务的自动提交
- 事务的手动提交
- 开始事务
- 执行SQL操作
- 事务操作
- 提交事务
- 示例:
- 事务的隔离级别
- 并发访问的基本概念
- 并发事务的典型问题
- 对ACID特性的影响
- 查看和设置隔离属性
- 各个隔离级别的详细介绍
- 读未提交`EAD UNCOMMITTED`
- 读提交`READ COMMITTED`
- 可重复读`REPEATABLE READ`(默认)
- 串行化`SERIALIZABLE`
什么是事务?
在 MySQL 中只有使用了 ==InnoDB 数据库引擎的数据库或表才支持事务, MyISAM 不支持。==事务(Transaction) 是一组(可以为一句或多句)SQL 语句的集合,这些语句作为一个整体执行,要么全部成功,要么全部失败。
事务的特性:
事务通常用 ACID 特性来描述:
- 原子性(Atomicity)
事务中的所有操作要么全部成功,要么全部失败。如果事务中的任何一条语句失败,整个事务都会被回滚(Rollback),恢复到事务开始前的状态。 - 一致性(Consistency)
事务执行后,数据库必须从一个一致的状态转换到另一个一致的状态。一致性可以理解为“目标达成过程是合理且符合规则的”。例如,转账操作中,总金额在转账前后应该保持一致。 - 隔离性(Isolation)
多个并发事务之间相互隔离,一个事务的操作不会影响其他事务。MySQL 提供了不同的隔离级别(如 READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ、SERIALIZABLE)来控制事务的隔离程度。 - 持久性(Durability)
一旦事务提交(Commit),它对数据库的修改就是永久性的,即使系统发生故障也不会丢失。
事务的意义
事务的主要目的是确保数据库的完整性和一致性,特别是在并发操作和系统故障的情况下。
- 确保数据完整性
事务将一组操作(SQL 语句)打包成一个逻辑单元,要么全部成功,要么全部失败。
例子:银行转账操作中,从账户 A 扣款和向账户 B 加款必须同时成功或同时失败。如果只有扣款成功而加款失败,数据就会不一致。
意义:事务避免了部分操作成功、部分操作失败导致的数据不一致问题。 - 支持并发操作
在多用户或多应用同时访问数据库时,事务通过隔离性确保并发操作不会互相干扰。
例子:用户 A 和用户 B 同时修改同一条数据,事务可以确保他们的操作按顺序执行,而不是互相覆盖。
意义:事务保证了并发环境下的数据正确性。 - 提供故障恢复机制
在系统发生故障(如断电、崩溃)时,事务的持久性确保已提交的操作不会丢失,而未提交的操作会被回滚。
例子:如果数据库在转账过程中崩溃,事务可以确保恢复到转账前的状态,避免数据损坏。
意义:事务提高了系统的可靠性和容错能力。 - 简化复杂操作
事务将复杂的操作封装成一个逻辑单元,开发者不需要手动处理每一步操作的成功或失败。
例子:在电商系统中,下单操作可能涉及库存减少、订单记录生成、支付状态更新等多个步骤,事务可以确保这些步骤要么全部成功,要么全部回滚。
意义:事务简化了开发流程,降低了出错概率。 - 支持一致性约束
事务可以确保数据库从一个一致状态转换到另一个一致状态,满足业务规则和约束条件。
例子:在库存管理系统中,库存数量不能为负数,事务可以确保所有操作都符合这一规则。
意义:事务维护了数据的逻辑正确性。
事务的提交
没错,事务是需要提交的。
查看事务提交方式
show variables like 'autocommit';
mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | ON |
+---------------+-------+
1 row in set (0.41 sec)
autocommit = 1(ON):表示自动提交
autocommit = 0(OFF):表示禁止自动提交
事务的自动提交
在 MySQL 中,默认情况下,每条 SQL 语句都会自动提交autocommit = 1(ON)。
事务的手动提交
用 SET 来改变 MySQL 的自动提交模式:
mysql> SET AUTOCOMMIT=0;
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | OFF |
+---------------+-------+
1 row in set (0.00 sec)
autocommit = 0(OFF)时需要手动提交:
开始事务
使用 START TRANSACTION 或 BEGIN 语句开始一个新的事务。
执行SQL操作
在事务中执行一系列 SQL 操作(如 INSERT、 UPDATE、DELETE)。
事务操作
创建临时保存点: savepoint save2;(save2为保存点的名)
回滚操作:rollback to save2;(回滚到save2保存点)
rollback:回滚到最开始
如果一个事务被提交了(commit),则不可以回退(rollback)
提交事务
使用COMMIT进行事务提交。
示例:
#开始事务
START TRANSACTION;#操作1:从账户1扣款100元
UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
#操作2:向账户2加款100元
UPDATE accounts SET balance = balance + 100 WHERE user_id = 2;#提交事务
COMMIT;
事务的隔离级别
并发访问的基本概念
在数据库领域,并发特指数据库系统同时处理多个事务的能力,允许不同用户/应用程序同时访问和修改数据。
MySQL服务会被多个客户端进程/线程并发访问,这些访问以事务方式执行。
并发事务的典型问题
如果没有适当的事务隔离机制(Isolation),并发事务之间会产生三种典型问题:
- 脏读(Dirty Read):事务A读取到事务B未提交的修改
- 不可重复读(Non-repeatable Read):事务A内两次读取同一数据,结果不同(因事务B在此期间修改了数据)
- 幻读(Phantom Read):事务A两次查询同一条件,得到不同记录集(因事务B在此期间新增/删除了数据)
对ACID特性的影响
这些问题会破坏事务的ACID特性中的:
- 一致性:事务执行后数据库应保持合法状态
- 隔离性:事务间不应相互干扰
事务隔离性指的是在并发环境下,一个事务的执行不应受到其他并发事务的干扰,每个事务都应该像是在独立执行一样。确保业务逻辑的正确执行,避免因并发导致的数据逻辑错误。
上述问题MySQL通过四种隔离级别解决这些问题:
| 隔离级别 | 脏读 | 不可重复读 | 幻读 | 备注 |
|---|---|---|---|---|
| 读未提交 EAD UNCOMMITTED | ✓ | ✓ | ✓ | 最低隔离级别 |
| 读提交 READ COMMITTED | × | ✓ | ✓ | Oracle默认级别 |
| 可重复读 REPEATABLE READ(默认) | × | × | ✓ | MySQL默认级别 |
| 串行化 SERIALIZABLE | × | × | × | 最高隔离级别 |
*注:MySQL的InnoDB引擎通过间隙锁(Gap Lock)在REPEATABLE READ级别也能避免大部分幻读
隔离级别如何实现:隔离,基本都是通过锁实现的,不同的隔离级别,锁的使用是不同的。常见有,表
锁,行锁,读锁,写锁,间隙锁(GAP),Next-Key锁(GAP+行锁)等,
查看和设置隔离属性
隔离属性作用域是事务或会话
@@global.tx_isolation:全局事务隔离级别
@@session.tx_isolation:当前会话隔离级别
@@tx_isolation:等同于@@session.tx_isolation
#查看全局事务隔离级别和(当前)会话事务隔离级别
SELECT@@global.tx_isolation,@@session.tx_isolation;#设置隔离事务级别
set [session | global]
transaction isolation level
[read uncommitted | read commit | repeatable read | serializable];
#设置当前会话的隔离事务级别为 serializable
set session
transaction isolation level
serializable;
- MySQL默认
@@global.tx_isolation值为:REPEATABLE READ(可重复读)。 - 新会话的
@@session.tx_isolation会继承@@global.tx_isolation的当前值。 - 全局事务隔离级别用于初始化会话隔离事务级别的值。
- 更新
@@global.tx_isolation后只对于后续新创立的会话的@@session.tx_isolation生效。已有会话的隔离级别不变。 - 更新
@@session.tx_isolation后只对于当前会话后续新建的事务生效。已开启的事务不生效。
各个隔离级别的详细介绍
- 每个事务的读取行为只受自身隔离级别控制
- 写操作会受其他事务的隔离级别间接影响(通过锁机制)
- 不同级别事务间的交互需要通过锁机制协调
假设:有两个会话A、B。
场景:银行转账业务C、D两个账户(初始余额:C=1000,D=1000)
假设:会话B新建事务(进行向D账户转100,转三次,并新增一个E账户存1000)
读未提交EAD UNCOMMITTED
当A在新建事务前为此隔离等级此时不论B会话处于什么隔离级别,A会话下事务可以随时读取B下事务未提交的结果 A会话下的事务每次访问D账户的余额可能不同,同时随时可能新增一个账户 显示这是脏读、不可重复读和幻读
此隔离级别下的事务几乎没有隔离性。
读提交READ COMMITTED
当A会话在新建事务前为此隔离等级那么A会话下的事务在B会话下的事务未提交前是看不到D账户有任何变化的,但若B下的事务早于A下的事务进行了提交,那么A下的事务每次查询(提交前和提交后)的结果仍可能不同显然这是不可重复读和幻读。
可重复读REPEATABLE READ(默认)
在MYSQL中当A会话在新建事务前为此隔离等级 A会话下的事务看不到其他事务在A启动后提交的任何新数据
值得一提的是: 一般的数据库在可重复读情况的时候,无法屏蔽其他事务insert的数据(为什么?因为隔离性实现是对数据加锁完成的,而insert待插入的数据因为并不存在,那么一般加锁无法屏蔽这类问题),会造成虽然大部分内容是可重复读的,但是insert的数据在可重复读情况被读取出来,导致多次查找时,会多查找出来新的记录,就如同产生了幻觉。这种现象,叫做幻读。很明显,MySQL在RR级别的时候,是解决了幻读问题的(解决的方式是用Next-Key锁(GAP+行锁)解决的。
串行化SERIALIZABLE
对所有操作全部加锁,进行串行化,不会有问题。
隔离级别越严格,安全性越高,但数据库的并发性能也就越低,往往需要在两者之间找一个平衡点。
相关文章:
【MySQL | 八、 事务管理】
文章目录 什么是事务?事务的特性:事务的意义事务的提交查看事务提交方式事务的自动提交事务的手动提交开始事务执行SQL操作事务操作提交事务示例: 事务的隔离级别并发访问的基本概念并发事务的典型问题对ACID特性的影响查看和设置隔离属性各个…...
AlDente Pro for Mac电脑 充电限制保护工具
AlDente Pro for Mac电脑 充电限制保护工具 一、介绍 AlDente Pro for Mac,是一款充电限制保护工具,是可以限制最大充电百分比来保护电池的工具。锂离子和聚合物电池(如 MacBook 中的电池)在40% 至 80% 之…...
算法训练之动态规划(一)
♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨ 个…...
Navicat连接远程PostGreSQL失败
问题描述 使用本地Navicat连接Windows远程服务器上部署的PostGreSQL数据库时,出现以下错误: 解决方案 出现以上报错信息,是因为PostGreSQL数据库服务尚未设置允许客户端建立远程连接。可做如下配置, 1. 找到PostGreSQL数据库安装目录下的data子文件夹,重点关注:postgres…...
漏洞扫描系统docker版本更新(2025.4.10)
一、github地址 https://github.com/huan-cdm/info_scan本人一直维护的一个项目,持续更新中,感兴趣的小伙伴帮忙点点星 二、docker版本更新 1. 账号密码:nginx/web/mysql:admin/123456 2. 创建docker自定义网络,使容…...
新一代达梦官方管理工具SQLark:可视化建表操作指南
在数据库管理工作中,新建表是一项基础且频繁的操作。SQLark 的可视化建表功能为我们提供了一种高效、便捷且丝滑流畅的建表新体验。一起来了解下吧。 SQLark 官方下载链接:www.sqlark.com 新建表作为常见的功能,相比其他管理工具,…...
什么是EXR透视贴图 ?
EXR透视贴图是一种基于 OpenEXR 格式的高动态范围(HDR)图像技术,主要用于3D建模、渲染和视觉特效领域。它通过高精度图像数据和透视映射功能,为场景创建逼真的光影效果和空间深度。 技术原理 高动态范围(HDR…...
音频转文本:如何识别音频成文字
Python脚本:MP4转MP3并语音识别为中文 以下是一个完整的Python脚本,可以将MP4视频转换为MP3音频,然后使用语音识别模型将音频转换为中文文本。 准备工作 首先需要安装必要的库: pip install moviepy pydub SpeechRecognition openai-whisper完整脚本 import os from m…...
每日一题(小白)数组娱乐篇21
由于题意可知我们是要将对应的数字转换为英文,我们要考虑两点一个是进制的转换,也就是类似于我们的十进制一到9就多一位,这里的进制就是Z进制也就是27进制一旦到26下一位则进位;另一方面要考虑数字的转换也就是1~26对应A~Z。解决上…...
LINUX的使用(1)-挂载云硬盘
1.磁盘的挂载: 这个输出是来自 fdisk 或类似的工具,它展示了两块磁盘的分区信息。让我们逐个分析: 第一块磁盘 /dev/sda: 磁盘大小: 53.7 GB (约 53687091200 字节),总共有 104857600 个扇区。扇区单位: 每个扇区大小为 512 字节…...
GPT-4o-image模型:开启AI图片编辑新时代
在生成式AI技术爆发式迭代的今天,智创聚合API率先突破多模态创作边界,正式发布集成GPT-4o-image模型的创作平台,以“文生图-图生图-循环编辑”三位一体的技术矩阵,重新定义数字内容生产流程。生成图像效率较传统工具提升300%&…...
基于Python的网络爬虫技术研究
基于Python的网络爬虫技术研究 以下从多个方面为你介绍基于 Python 的网络爬虫技术: 概述 网络爬虫是一种自动获取网页内容的程序,在 Python 中可以借助诸多强大的库和工具实现。网络爬虫能应用于数据采集、搜索引擎、舆情监测等众多领域。 核心库 …...
使用pip3安装PyTorch与PyG,实现NVIDIA CUDA GPU加速
使用python3的pip3命令安装python依赖库。 # python3 -V Python 3.12.3 # # pip3 -V pip 25.0.1 from /root/.pyenv/versions/3.12.3/lib/python3.12/site-packages/pip (python 3.12)Usage: pip3 install [options] <package> ...pip3 install [options] -r <re…...
Rust主流框架性能比拼: Actix vs Axum vs Rocket
本内容是对知名性能评测博主 Anton Putra Actix (Rust) vs Axum (Rust) vs Rocket (Rust): Performance Benchmark in Kubernetes 内容的翻译与整理, 有适当删减, 相关指标和结论以原作为准 在以下中,我们将比较 Rust 生态中最受欢迎的几个框架。我会将三个应用程序…...
设计模式-观察者模式和发布订阅模式区别
文章目录 其他不错的文章 二者有类似的地方,也有区别。 引用的文章说的已经比较清楚了,这里只列出对比图。 对比点观察者模式发布订阅模式中间人角色无事件中心,观察者直接订阅目标有事件中心,发布者与订阅者通过事件中心通信关系…...
【QT】QT的消息盒子和对话框(自定义对话框)
QT的消息盒子和对话框(自定义对话框) 一、消息盒子QMessageBox1、弹出警告盒子示例代码:现象: 2、致命错误盒子示例代码:现象: 3、帮助盒子示例代码:现象: 4、示例代码: …...
ArcGIS 给大面内小面字段赋值
文章目录 引言:地理数据处理中的自动化赋值为何重要?实现思路模型实现关键点效果实现步骤1、准备数据2、执行3、完成4、效果引言:地理数据处理中的自动化赋值为何重要? 在地理信息系统(GIS)的日常工作中,空间数据的属性字段赋值是高频且关键的操作,例如在土地利用规划…...
【结合vue源码,分析vue2及vue3的数据绑定实现原理】
结合vue源码,分析vue2及vue3的数据绑定实现原理 Vue 2 数据绑定实现整体思路详细实现1. Observer 类:数据劫持2. Dep 类:依赖收集3. Watcher 类:订阅者 Vue 3 数据绑定实现整体思路详细实现1. reactive 函数:创建响应式…...
WebGPU:前端图形技术的革命性进化与WebGL的未来
WebGPU:前端图形技术的革命性进化与WebGL的未来 WebGPU作为新一代Web图形API,正在引发前端图形领域的深刻变革。本文将全面剖析WebGPU的技术优势、性能表现、应用场景,以及它与WebGL的关系和未来发展趋势。 WebGPU与WebGL的技术代差 WebGP…...
如何实现H5端对接钉钉登录并优雅扩展其他平台
如何实现H5端对接钉钉登录并优雅扩展其他平台 钉钉H5登录逻辑后端代码如何实现?本次采用策略模式工厂方式进行定义接口确定会使用的基本鉴权步骤具体逻辑类进行实现采用注册表模式(Registry Pattern)抽象工厂进行基本逻辑定义具体工厂进行对接…...
Android MediaStore访问的外部存储公共空间都不需要申请权限,这些目录具体指的是哪些
在 Android 10 及更高版本中,通过 MediaStore 访问以下 外部存储公共目录 时,如果操作的是应用自己创建的文件,则无需申请存储权限。这些目录属于系统明确定义的媒体集合,具体包括: 1. 媒体类型目录…...
Java中的Exception和Error有什么区别?还有更多扩展
概念 在Java中,Exception和Error都是Throwable的子类,用于处理程序中的错误和异常情况。 然而,它们在用途和处理方式上有显著的不同: Exception: 用于表示程序在正常运行过程中可能出现的错误,如文件未找…...
LabVIEW真空度监测与控制系统
开发了一种基于LabVIEW的真空度信号采集与管理系统,该系统通过图形化编程语言实现了真空度的高精度测量和控制。利用LabVIEW的强大功能,研制了相应的硬件并设计了完整的软件解决方案,以满足工业应用中对真空度监测的精确要求。 项目背景 随着…...
虚拟dom工作原理以及渲染过程
浏览器渲染引擎工作流程都差不多,大致分为5步,创建DOM树——创建StyleRules——创建Render树——布局Layout——绘制Painting 第一步,用HTML分析器,分析HTML元素,构建一颗DOM树(标记化和树构建)。 第二步,用…...
数据采集爬虫三要素:User-Agent、随机延迟、代理ip
做爬虫的朋友都懂:你刚打开一个页面,还没来得及发第二个请求,服务器已经把你当成了“可疑流量”。403、429、验证码、JS挑战……这些“欢迎仪式”你是不是也经常收到?防爬策略越来越猛,采集工程师越来越秃。 但别慌&am…...
汽车的四大工艺
文章目录 冲压工艺核心流程关键技术 焊接工艺核心流程 涂装工艺核心流程 总装工艺核心流程终检与测试静态检查动态检查四轮定位制动转鼓测试淋雨测试总结 简单总结下汽车的四大工艺(从网上找了一张图,感觉挺全面的)。 冲压工艺 将金属板材通过…...
【JVM是什么?JVM解决什么问题?JVM在JDK体系中是什么?虚拟机和JVM、操作系统是什么关系?】
1. JVM 是什么? JVM(Java Virtual Machine,Java 虚拟机) 是一个虚拟的计算机程序,它是 Java 程序运行的核心环境。JVM 的主要职责是加载、验证、解释或编译 Java 字节码(.class 文件)ÿ…...
21 天 Python 计划:MySQL中DML与权限管理
文章目录 前言一、介绍二、MySQL数据操作:DML2.1 插入数据(INSERT)2.1.1 插入完整数据(顺序插入)2.1.2 指定字段插入数据2.1.3 插入多条记录2.1.4 插入查询结果 2.2 更新数据(UPDATE)2.3 删除数…...
10-MySQL-性能优化思路
1、优化思路 当我们发现了一个慢SQL的问题的时候,需要做性能优化,一般我们是为了提高SQL查询更快,一个查询的流程由下图的各环节组成,每个环节都会消耗时间,要减少消耗时候需要从各个环节都分析一遍。 2 连接配置优化 第一个环节是客户端连接到服务端,这块可能会出现服务…...
MySQL学习笔记十
第十二章汇总数据 12.1聚集函数 聚集函数运行在行组上,计算和返回单个值。 12.1.1AVG()函数 输入: SELECT AVG(prod_price) AS avg_price FROM products; 输出: 说明:AVG()函数通过对表中行数计数并计算特定列值之和&#…...
