MySQL 事务详解

MySQL 事务详解

    • 一、事务是什么?
      • 为什么需要事务?
    • 二、事务的四大特性(ACID)
      • 举例说明:转账操作
    • 三、MySQL 中事务的支持
    • 四、事务分类:隐式 vs 显式
      • 1. 隐式事务(自动提交)
      • 2. 显式事务(手动控制)
    • 五、事务的操作语句
      • 使用保存点(SAVEPOINT)
    • 六、并发事务带来的问题
    • 七、事务隔离级别
    • 八、InnoDB 如何实现事务
      • 1. 重做日志(Redo Log)
      • 2. 撤销日志(Undo Log)
      • 3. MVCC(多版本并发控制)
    • 九、最佳实践与注意事项
    • 十、总结

一、事务是什么?

在数据库系统中,事务(Transaction) 是指一组操作序列,这些操作要么全部执行成功,要么全部不执行,是数据库操作的基本单位,主要用于保证数据的一致性和完整性。

为什么需要事务?

在多个 SQL 操作依赖于彼此时,若某条操作失败,必须撤销之前的操作以防止数据不一致。例如:

UPDATE account SET balance = balance - 100 WHERE user = 'A';
UPDATE account SET balance = balance + 100 WHERE user = 'B';

如果第二条语句失败,而第一条已经生效,就会导致数据不一致。事务机制可以确保这种情况不会发生。


二、事务的四大特性(ACID)

特性含义
原子性(Atomicity)事务中的所有操作要么全部成功,要么全部失败,不会停留在中间状态。
一致性(Consistency)事务前后数据库保持一致状态,不会因事务失败造成数据损坏。
隔离性(Isolation)并发事务之间互不干扰,每个事务的执行不会被其他事务看到。
持久性(Durability)一旦事务提交成功,结果将永久保存到数据库,即使系统崩溃也不丢失。

举例说明:转账操作

步骤操作说明
1A账户减100元原子性的一部分
2B账户加100元必须与上一步一同成功
3事务提交所有变更永久保存
若第2步失败,事务回滚保证一致性、原子性

三、MySQL 中事务的支持

不是所有存储引擎都支持事务,常见如下:

存储引擎是否支持事务是否支持外键
InnoDB
MyISAM
MEMORY
TokuDB

查看支持情况:

SHOW ENGINES;

四、事务分类:隐式 vs 显式

1. 隐式事务(自动提交)

MySQL 默认自动提交每一条 DML 语句:

UPDATE users SET age = 30 WHERE id = 1; -- 自动提交

2. 显式事务(手动控制)

当需要将多条语句当作一个整体执行时,使用显式事务:

SET autocommit = 0; -- 禁用自动提交
START TRANSACTION;
UPDATE users SET balance = balance - 100 WHERE name = 'A';
UPDATE users SET balance = balance + 100 WHERE name = 'B';
COMMIT; -- 提交事务
-- ROLLBACK; -- 取消事务

推荐使用 BEGIN 作为 START TRANSACTION 的简洁写法。


五、事务的操作语句

语句含义
START TRANSACTION / BEGIN显式开启事务
COMMIT提交事务,持久保存变更
ROLLBACK回滚事务,撤销变更
SAVEPOINT设置事务保存点(用于局部回滚)
ROLLBACK TO SAVEPOINT回滚到某个保存点

使用保存点(SAVEPOINT)

START TRANSACTION;
UPDATE t SET score = 90 WHERE id = 1;
SAVEPOINT sp1;
UPDATE t SET score = 100 WHERE id = 1;
ROLLBACK TO sp1; -- 回滚到sp1,score回到90
COMMIT;

六、并发事务带来的问题

在并发执行多个事务时,若没有合理控制,会产生以下问题:

并发问题描述
脏读读到未提交事务修改的数据
不可重复读同一事务两次读到不同数据
幻读同一查询两次返回行数不同(新增/删除行)

七、事务隔离级别

事务的隔离级别定义了事务间可见的数据范围,MySQL 支持如下四种:

隔离级别描述能否避免并发问题
READ UNCOMMITTED允许读未提交的数据(最低)❌脏读、不可重复读、幻读
READ COMMITTED只能读已提交的数据✅脏读 ❌不可重复读、幻读
REPEATABLE READ可重复读(MySQL 默认)✅脏读 ✅不可重复读 ❌幻读
SERIALIZABLE串行执行(最高隔离)✅全部避免,但性能最低

设置隔离级别:

-- 查询当前隔离级别
SELECT @@transaction_isolation;-- 修改隔离级别(会话级)
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;

八、InnoDB 如何实现事务

InnoDB 使用以下机制来支持事务:

1. 重做日志(Redo Log)

用于保证持久性,即使崩溃后也能恢复事务提交的结果。

2. 撤销日志(Undo Log)

用于支持原子性和一致性。当事务回滚时,Undo Log 可以撤销操作。

3. MVCC(多版本并发控制)

实现事务的隔离性(特别是可重复读),通过版本控制每一行数据,允许事务读到历史版本数据。


九、最佳实践与注意事项

  • 显式开启事务时,要显式 COMMITROLLBACK,否则锁会长期占用。
  • 控制事务作用域,不要将事务保持过长时间。
  • 多个事务同时操作数据时要注意锁竞争与死锁问题。
  • 尽量使用合适的隔离级别以提升性能。
  • 结合业务需求设置合适的回滚点 SAVEPOINT

十、总结

MySQL 事务机制是保证数据一致性、完整性的重要基础。掌握事务的使用方法、隔离级别、InnoDB 实现原理,以及并发控制策略,是每位开发者和 DBA 的必备技能。


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

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

相关文章

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…

利用coze工作流制作一个自动生成PPT的智能体

在Coze平台中,通过工作流实现PPT自动化生成是一个高效且灵活的解决方案,尤其适合需要快速产出标准化演示文稿的场景。以下是基于Coze工作流制作PPT的核心逻辑与操作建议: 理论流程 一、核心流程设计 需求输入与解析 用户输入:主…

vue3 按钮级别权限控制

在Vue 3中实现按钮级别的权限控制,可以通过多种方式实现。这里我将介绍几种常见的方法: 方法1:使用Vue 3的Composition API 在Vue 3中,你可以使用Composition API来创建一个可复用的逻辑来处理权限控制。 创建权限控制逻辑 首…

spa首屏加载慢怎样解决

SPA(Single Page Application,单页应用)首屏加载慢是一个常见问题,主要原因通常是首次加载需要拉取体积较大的 JavaScript 文件、样式表、初始化数据等。以下是一些常见的 优化策略,可以帮助你 提升首屏加载速度&#…

UE5 音效系统

一.音效管理 音乐一般都是WAV,创建一个背景音乐类SoudClass,一个音效类SoundClass。所有的音乐都分为这两个类。再创建一个总音乐类,将上述两个作为它的子类。 接着我们创建一个音乐混合类SoundMix,将上述三个类翻入其中,通过它管理每个音乐…

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…

NTT印地赛车:数字孪生技术重构赛事体验范式,驱动观众参与度革命

引言&#xff1a;数字孪生技术赋能体育赛事&#xff0c;开启沉浸式观赛新纪元 在传统体育赛事观赛模式遭遇体验天花板之际&#xff0c;NTT与印地赛车系列赛&#xff08;NTT INDYCAR SERIES&#xff09;的深度合作&#xff0c;通过数字孪生&#xff08;Digital Twin&#xff09…

解构与重构:PLM 系统如何从管理工具进化为创新操作系统?

在智能汽车、工业物联网等新兴领域的冲击下&#xff0c;传统产品生命周期管理&#xff08;PLM&#xff09;系统正在经历前所未有的范式转换。当某头部车企因 ECU 软件与硬件模具版本失配导致 10 万辆智能电车召回&#xff0c;损失高达 6 亿美元时&#xff0c;这场危机不仅暴露了…

【Ubuntu 16.04 (Xenial)​​】安装docker及容器详细教程

Ubuntu 16.04 安装docker详细教程 一、docker安装1.1 前期准备1.2 使用 Docker 官方安装脚本安装&#xff08;推荐&#xff09; 查看ubuntu版本&#xff1a;lsb_release -a 这里我的系统是 ​​Ubuntu 16.04 (Xenial)​​&#xff0c;在 ​​Ubuntu 16.04 (Xenial)​​ 上安装…

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…

MySQL:InnoDB架构(内存架构篇)

目录 0.前置知识 0.1二级索引的概念 二级索引查询原理 1.整体架构 1.1为什么innoDB的架构会分为两个部分? 2.内存架构 2.1BufferPool 2.2ChangeBuffer 唯一性检查不是实时性会出现的问题? ChangeBuffer的优势 2.3Adaptive Hash Index 2.4LogBuffer 0.前置知识 0.…

鹰盾加密器“一机一码”技术全维度剖析:从底层实现到生态防护体系

“一机一码”加密技术的深度解析与实现路径 引言 在数字内容版权保护和软件授权管理领域&#xff0c;“一机一码”技术作为一种重要的安全防护手段&#xff0c;能够有效防止授权码滥用和非法传播。它通过建立设备与授权码的唯一对应关系&#xff0c;确保每份授权仅在特定设备…

Android 中使用 OkHttp 创建多个 Client

在 Android 开发中&#xff0c;有时我们需要创建多个 OkHttpClient 实例来满足不同的网络请求需求。以下是创建和管理多个 OkHttpClient 的方法&#xff1a; 基本创建方式 // 创建默认的 OkHttpClient val defaultClient OkHttpClient()// 创建带有自定义配置的 Client val …

C++中的跳转语句

C中的跳转语句包括break、continue和goto&#xff0c;它们用于改变程序的正常执行流程。下面分别介绍它们的作用、使用场景和注意事项&#xff1a; 1. break 作用&#xff1a; • 立即终止当前所在的循环&#xff08;for、while、do while&#xff09;或switch语句&#xff…

AI在网络安全领域的应用现状和实践

当前&#xff0c;人工智能技术已深度融入网络安全产品&#xff0c;推动传统防御模式向智能化、自适应方向加速演进。各安全厂商通过机器学习、深度学习与知识图谱等技术的融合应用&#xff0c;提高安全产品在威胁检测、攻击溯源、风险评估等场景的能力跃迁&#xff0c;突破传统…

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…

Spark 之 DataFrame 开发

foreachPartition val data = spark.sparkContext.parallelize(1 to 100)// 使用 foreachPartition 批量处理分区 data.foreachPartition {partitionIterator =

UDP:简洁高效的报文结构解析与关键注意事项

UDP&#xff08;User Datagram Protocol&#xff09;以其无连接、低开销的特性&#xff0c;成为实时应用&#xff08;如视频、游戏、DNS&#xff09;的首选传输协议。深入理解其报文结构和注意事项&#xff0c;是高效利用UDP的基础。 一、UDP报文结构&#xff1a;简洁的四段式 …

Cursor 工具项目构建指南:让 AI 审查 AI 生产的内容,确保生产的内容质量和提前发现问题

简简单单 Online zuozuo: 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo :本心、输入输出、结果 简简单单 Online zuozuo : 文章目录 Cursor 工具项目构建指南:让 AI 审查 AI 生产的内容,确保生产的内容质量和提前发现问…

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…