当前位置: 首页 > article >正文

MySQL 8.0 事务全面讲解

以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。


MySQL 8.0 事务全面讲解

一、事务的核心概念(ACID)

事务是数据库操作的最小逻辑单元,具有 ACID 特性:

  1. 原子性(Atomicity):事务中的操作要么全部成功,要么全部失败回滚。
  2. 一致性(Consistency):事务执行前后,数据库的完整性约束(如主键、外键)始终有效。
  3. 隔离性(Isolation):多个事务并发执行时,彼此互不干扰。
  4. 持久性(Durability):事务提交后,修改永久生效,即使系统崩溃。

二、事务的基本操作

1. 开启事务

MySQL 8.0 默认开启自动提交(autocommit=1),需手动关闭以显式管理事务。

-- 查看当前 autocommit 状态
SELECT @@autocommit;-- 关闭自动提交(仅对当前会话生效)
SET autocommit = 0;-- 显式开启事务
START TRANSACTION;
2. 提交事务

事务中的操作只有在提交后才会永久生效。

-- 提交事务
COMMIT;
3. 回滚事务

撤销事务中的所有操作,恢复到事务开始前的状态。

-- 回滚事务
ROLLBACK;
4. 保存点(Savepoint)

允许在事务中设置多个保存点,回滚到指定保存点而非事务起点。

-- 设置保存点
SAVEPOINT savepoint_name;-- 回滚到保存点
ROLLBACK TO savepoint_name;-- 删除保存点(释放资源)
RELEASE SAVEPOINT savepoint_name;

三、事务示例详解

示例 1:基础事务操作(转账场景)
-- 创建账户表
CREATE TABLE account (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(20),balance DECIMAL(10, 2)
) ENGINE = INNODB;-- 插入初始数据
INSERT INTO account (name, balance) VALUES('Alice', 1000.00),('Bob', 1000.00);-- 开启事务
START TRANSACTION;-- Alice 转账 200 到 Bob
UPDATE account SET balance = balance - 200 WHERE name = 'Alice';
UPDATE account SET balance = balance + 200 WHERE name = 'Bob';-- 提交事务
COMMIT;-- 查询结果
SELECT * FROM account;
示例 2:失败回滚实例
-- 开启事务
START TRANSACTION;-- 第一个操作:Alice 转账 200
UPDATE account SET balance = balance - 200 WHERE id = 1;-- 第二个操作:Bob 转账 200(假设字段名拼写错误)
UPDATE account SET balance = balance + 200 WHERE id = 2;-- 回滚事务(因错误自动触发)
ROLLBACK;-- 验证结果(数据未改变)
SELECT * FROM account;

四、事务隔离级别

1. 查看当前会话隔离级别
-- MySQL 8.0 正确命令
SELECT @@transaction_isolation;
2. 设置隔离级别
-- 设置当前会话隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
隔离级别描述典型问题
READ UNCOMMITTED允许脏读最低隔离级别
READ COMMITTED禁止脏读,允许不可重复读Oracle 默认
REPEATABLE READ禁止脏读和不可重复读(MySQL 默认)通过间隙锁防止幻读
SERIALIZABLE禁止脏读、不可重复读和幻读最高隔离级别

五、事务性 DDL(MySQL 8.0 新特性)

1. 事务性 DDL 的启用

需关闭 autocommit 并显式开启事务。

-- 创建测试表
CREATE TABLE test_table (id INT PRIMARY KEY,data VARCHAR(100)
);-- 开启事务
START TRANSACTION;-- 修改表结构(事务性 DDL)
ALTER TABLE test_table ADD COLUMN new_col INT;-- 提交事务
COMMIT;
2. 事务性 DDL 的失败回滚
-- 开启事务
START TRANSACTION;-- 添加新列
ALTER TABLE test_table ADD COLUMN new_col INT;-- 模拟错误(重复添加列)
ALTER TABLE test_table ADD COLUMN new_col INT;-- 回滚事务(撤销所有 DDL 操作)
ROLLBACK;-- 验证结果(表中未添加 new_col)
DESCRIBE test_table;

六、XA 分布式事务

1. 内部 XA 事务

用于协调单实例中多个存储引擎(如 InnoDB 和 Binlog)的一致性。

-- 创建测试表
CREATE TABLE xa_test (id INT PRIMARY KEY,value VARCHAR(50)
) ENGINE=InnoDB;-- 开启事务
START TRANSACTION;-- 插入数据
INSERT INTO xa_test (id, value) VALUES (1, 'Test');-- 提交事务(内部 XA 自动处理)
COMMIT;
2. 外部 XA 事务(跨数据库实例)

需应用程序作为事务协调器(TM),MySQL 作为参与者(RM)。

-- 在 MySQL 实例 1 中
XA START 'my_xa_transaction';
INSERT INTO xa_test (id, value) VALUES (2, 'XA Test');
XA END 'my_xa_transaction';
XA PREPARE 'my_xa_transaction';-- 在 MySQL 实例 2 中
XA START 'my_xa_transaction';
INSERT INTO xa_test (id, value) VALUES (3, 'XA Test');
XA END 'my_xa_transaction';
XA PREPARE 'my_xa_transaction';-- 应用程序协调提交
XA COMMIT 'my_xa_transaction';

七、事务失败回滚的常见原因与解决方案

原因解决方案
死锁优化事务逻辑,减少锁冲突;MySQL 会自动回滚其中一个事务。
事务超时调整 innodb_lock_wait_timeout 参数,或优化事务逻辑以减少执行时间。
磁盘空间不足清理磁盘空间,确保事务日志(如 redo log)和回滚段(undo log)有足够的空间。
权限不足检查用户权限,确保拥有 SUPER 权限(全局隔离级别修改)或 XA 权限(分布式事务)。
语法错误/约束冲突捕获异常并回滚事务,使用存储过程或应用程序层处理错误。

八、事务的注意事项

  1. 引擎支持

    • InnoDB 支持事务,MyISAM 等引擎不支持。
    • 确保表使用 InnoDB 引擎:
      CREATE TABLE example (id INT) ENGINE=InnoDB;
      
  2. 自动提交模式

    • 自动提交(autocommit=1)下,每条 SQL 为独立事务。
    • 显式事务需关闭自动提交。
  3. DDL 与事务

    • 事务性 DDL 需手动开启事务。
    • 非事务性 DDL(如 CREATE DATABASE)会隐式提交当前事务。
  4. 死锁处理

    • 并发事务可能导致死锁,MySQL 会自动检测并回滚其中一个事务。
    • 通过 SHOW ENGINE INNODB STATUS 查看死锁日志。

九、总结

MySQL 8.0 的事务功能在传统 ACID 特性基础上,引入了 事务性 DDL事务数据字典增强的 XA 分布式事务支持,显著提升了数据一致性和管理效率。以下是关键实践建议:

  • 显式事务管理:在复杂业务中(如转账、订单处理)使用 START TRANSACTIONCOMMITROLLBACK
  • 保存点机制:在长事务中设置保存点,灵活控制回滚范围。
  • 事务性 DDL:对表结构修改使用事务性 DDL,确保元数据操作的原子性。
  • 隔离级别调优:根据业务需求选择合适的隔离级别(如 REPEATABLE READ 是 MySQL 默认)。
  • 引擎选择:始终使用 InnoDB 引擎以支持事务。

通过合理设计事务逻辑,结合 MySQL 8.0 的新特性,可以构建高可靠性和高性能的数据库应用。

相关文章:

MySQL 8.0 事务全面讲解

以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...

免费数学几何作图web平台

光锐软件免费数学工具,maths,数学制图,数学作图,几何作图,几何,AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...

基于Springboot+Vue的办公管理系统

角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...

Linux nano命令的基本使用

参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...

Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换

目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...

Razor编程中@Html的方法使用大全

文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...

Windows安装Miniconda

一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...

iview框架主题色的应用

1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...

Web中间件--tomcat学习

Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...

Golang——6、指针和结构体

指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...

三分算法与DeepSeek辅助证明是单峰函数

前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...

宇树科技,改名了!

提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...

LRU 缓存机制详解与实现(Java版) + 力扣解决

📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...

【网络安全】开源系统getshell漏洞挖掘

审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)

引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...

多模态图像修复系统:基于深度学习的图片修复实现

多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...

NPOI Excel用OLE对象的形式插入文件附件以及插入图片

static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...

GO协程(Goroutine)问题总结

在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...

C++ 设计模式 《小明的奶茶加料风波》

👨‍🎓 模式名称:装饰器模式(Decorator Pattern) 👦 小明最近上线了校园奶茶配送功能,业务火爆,大家都在加料: 有的同学要加波霸 🟤,有的要加椰果…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看

文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...

uniapp 字符包含的相关方法

在uniapp中,如果你想检查一个字符串是否包含另一个子字符串,你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的,但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...

解读《网络安全法》最新修订,把握网络安全新趋势

《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...

计算机基础知识解析:从应用到架构的全面拆解

目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

Python Einops库:深度学习中的张量操作革命

Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...

C# 表达式和运算符(求值顺序)

求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...

省略号和可变参数模板

本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...

jmeter聚合报告中参数详解

sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample&#xff08;样本数&#xff09; 表示测试中发送的请求数量&#xff0c;即测试执行了多少次请求。 单位&#xff0c;以个或者次数表示。 示例&#xff1a;…...