MySQL 数据库事务实践
引言
在现代应用程序开发中,确保数据库操作的完整性和一致性至关重要。MySQL 提供了强大的事务管理功能,允许开发者以原子性、一致性、隔离性和持久性(ACID)的方式处理数据。本文将通过详细的解释和实际示例,带你深入了解 MySQL 事务的工作原理,并展示如何在实际项目中应用这些知识。
目录
什么是事务
事务的 ACID 特性
MySQL 中的锁机制
事务隔离级别
事务控制语句
实战演练
环境准备
开始事务
执行多个 SQL 语句
查看当前状态
提交事务
测试回滚
使用保存点
常见问题及解决方案
总结
参考文献
什么是事务
事务 是一系列作为一个整体执行的操作序列,要么全部成功,要么完全不执行。它提供了对数据库操作的一种可靠方式,确保数据的一致性和完整性。例如,在银行转账过程中,扣款和存款必须同时成功或失败,否则会导致资金丢失或重复。
事务的 ACID 特性
- 原子性(Atomicity):事务是一个不可分割的工作单位,所有操作要么全部完成,要么一个也不做。
- 一致性(Consistency):事务必须使数据库从一个一致状态转变到另一个一致状态,即使在发生故障的情况下也应如此。
- 隔离性(Isolation):并发执行的多个事务不会互相干扰,每个事务都像是独立运行一样。
- 持久性(Durability):一旦事务提交,其对数据库的更改将是永久性的,即使系统崩溃也不会丢失。
MySQL 中的锁机制
MySQL 使用多种类型的锁来保证并发操作的安全性和效率:
- 表级锁:锁定整个表,适用于 MyISAM 和 MEMORY 存储引擎。
- 行级锁:只锁定需要操作的行,适用于 InnoDB 存储引擎。
- 页面锁:锁定一个页面(通常包含多行),介于表锁和行锁之间。
- 意向锁:用于解决表级锁与行级锁之间的冲突。
- 共享锁:允许多个事务读取同一行数据,但不允许修改。
- 排他锁:允许事务更新或删除一行数据,但禁止其他任何事务对该行加任何类型的锁。
- 间隙锁:锁定索引记录之间的“间隙”,防止幻读现象。
- Next-Key 锁:结合了行锁和间隙锁的功能,有效地防止幻读。
- 自增锁:用于控制
AUTO_INCREMENT列值的分配。
事务隔离级别
MySQL 支持四种标准的事务隔离级别,每种级别决定了不同事务之间相互可见的程度:
- 读未提交(READ UNCOMMITTED):最低的隔离级别,允许脏读。
- 读已提交(READ COMMITTED):不允许脏读,但允许不可重复读。
- 可重复读(REPEATABLE READ):这是 InnoDB 的默认隔离级别,保证同一事务内的多次读取结果相同,防止不可重复读。
- 串行化(SERIALIZABLE):最高的隔离级别,完全禁止了幻读现象,但性能开销较大。
设置隔离级别的语法如下:
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
事务控制语句
- 开始事务:
START TRANSACTION或BEGIN - 提交事务:
COMMIT - 回滚事务:
ROLLBACK - 保存点:
SAVEPOINT <identifier> - 释放保存点:
RELEASE SAVEPOINT <identifier> - 回滚到保存点:
ROLLBACK TO SAVEPOINT <identifier>
实战演练
环境准备
首先,创建一个测试数据库和表,并插入一些初始数据:
CREATE DATABASE IF NOT EXISTS test_db;
USE test_db;CREATE TABLE IF NOT EXISTS accounts (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(50),balance DECIMAL(10,2)
) ENGINE=InnoDB;INSERT INTO accounts (name, balance) VALUES ('Alice', 1000.00), ('Bob', 2000.00);
开始事务
使用 START TRANSACTION 或 BEGIN 来显式地开始一个事务:
START TRANSACTION;
执行多个 SQL 语句
在这个事务中,我们可以执行多个 SQL 语句,比如模拟转账操作:
-- 转账:从 Alice 的账户转 500 给 Bob
UPDATE accounts SET balance = balance - 500 WHERE name = 'Alice';
UPDATE accounts SET balance = balance + 500 WHERE name = 'Bob';
查看当前状态
可以在此时查询数据,查看当前事务中的更改是否生效:
SELECT * FROM accounts;
请注意,在事务未提交之前,这些更改只对当前事务可见,其他会话看不到这些更改。
提交事务
如果你对事务中的所有操作都满意,并希望将这些更改永久保存到数据库中,那么你可以提交事务:
COMMIT;
测试回滚
为了演示回滚的效果,我们可以再次开始一个新事务并故意制造一个错误:
START TRANSACTION;-- 尝试进行一次不合法的操作,例如从余额不足的账户中取款
UPDATE accounts SET balance = balance - 3000 WHERE name = 'Alice';-- 检查结果(应该看到没有变化)
SELECT * FROM accounts;-- 回滚事务以撤销这次失败的操作
ROLLBACK;-- 再次检查结果(确认一切恢复正常)
SELECT * FROM accounts;
使用保存点
保存点允许你在事务内部设置恢复点,以便部分回滚:
START TRANSACTION;-- 设置保存点
SAVEPOINT transfer_start;-- 执行转账操作
UPDATE accounts SET balance = balance - 500 WHERE name = 'Alice';
UPDATE accounts SET balance = balance + 500 WHERE name = 'Bob';-- 如果发现问题,可以回滚到保存点
ROLLBACK TO SAVEPOINT transfer_start;-- 最后不要忘记释放保存点
RELEASE SAVEPOINT transfer_start;COMMIT;
常见问题及解决方案
- 死锁:当两个或多个事务互相等待对方释放资源时会发生死锁。可以通过优化查询、减少持有锁的时间或者调整事务隔离级别来避免。
- 长时间持有锁:尽量缩短事务的生命周期,尽早提交或回滚事务。
- 性能问题:高并发场景下,选择合适的锁机制和隔离级别对于性能至关重要。
总结
通过上述内容的学习,你应该已经掌握了 MySQL 事务的基本概念及其在实际应用中的使用方法。理解事务的 ACID 特性、掌握不同的锁机制以及正确设置事务隔离级别,都是编写高效且可靠的数据库应用程序的基础。希望这篇文章能够帮助你在未来的项目中更好地利用 MySQL 的事务功能,确保数据操作的安全性和一致性。
参考文献
- MySQL 官方文档 - Transactions
- MySQL 官方文档 - Locking
相关文章:
MySQL 数据库事务实践
引言 在现代应用程序开发中,确保数据库操作的完整性和一致性至关重要。MySQL 提供了强大的事务管理功能,允许开发者以原子性、一致性、隔离性和持久性(ACID)的方式处理数据。本文将通过详细的解释和实际示例,带你深入…...
VScode、Windsurf、Cursor 中 R 语言相关快捷键设置
前言 在生物信息学数据分析中,R语言是一个不可或缺的工具。为了提高R语言编程效率,合理设置快捷键显得尤为重要。本文介绍在VSCode Windsurf Cursor 中一些实用的R语言快捷键设置,让非 Rstudio 的 IDE 用起来得心应手😑 操作种…...
tcpdump编译
https://github.com/westes/flex/releases/download/v2.6.4/flex-2.6.4.tar.gz tar -zxvf flex-2.6.4.tar.gz ./configure CFLAGS-D_GNU_SOURCE make sudo make installwget http://ftp.gnu.org/gnu/bison/bison-3.2.1.tar.gz ./configure make sudo make install以上两个库是…...
Linux下禁止root远程登录访问
开始讲故事 Long long ago, Linux远程访问方式有telnet、ssh两种协议;有人可能还会说vnc和rdp协议方式,后面这两种主要是可视化桌面场景下的,并非主流。 时过境迁,telnet因安全性低逐渐被禁用淘汰,最后就…...
算法刷题Day16: BM41 输出二叉树的右视图
题目链接 描述 思路: 递归构造二叉树在Day15有讲到。复习一下,就是使用递归构建左右子树。将中序和前序一分为二。 接下来是找出每一层的最右边的节点,可以利用队列层次遍历。 利用队列长度记录当前层有多少个节点,每次从队列里…...
登录授权的实现:json web token + redis + springboot
文章目录 引言I token实现思路传统JWT TOKEN认证方式改进的JWT TOKEN认证方式redis设计II java代码实现登录接口退出登录接口登录之后接口(token解析和校验)III 常见问题400引言 应用场景: 登录认证 I token实现思路 传统JWT TOKEN认证方式 RESTful API TOKEN认证方式:…...
yolov,coco,voc标记的睡岗检测数据集,可识别在桌子上趴着睡,埋头睡觉,座椅上靠着睡,平躺着睡等多种睡姿的检测,6549张图片
yolov,coco,voc标记的睡岗检测数据集,可识别在桌子上趴着睡,埋头睡觉,座椅上靠着睡,平躺着睡等多种睡姿的检测,6549张图片 数据集分割 6549总图像数 训练组91% 5949图片 有效集9&#x…...
数据库表的CRUD
SQL语句(Structured Query Language)是用于与关系型数据库进行交互的语言。下面是几个常用的SQL语句: 创建表: CREATE TABLE table_name ( column1 datatype, column2 datatype, column3 datatype, ... ); 插入数据: …...
Proxy与Reflect
监听对象操作 在Object中,可以通过defineProperty中的get,set进行监听, Proxy基本使用 有两个参数,第一个是要代理的对象,第二个是捕获器,在不知道捕获器使用哪个之前可以先传个空对象。就会启用默认的捕获…...
【安卓开发】【Android Studio】启动时报错“Unable to access Android SDK add-on list”
一、问题描述 在启动Android Studio时,软件报错:Unable to access Android SDK add-on list,报错截图如下: 二、原因及解决方法 初步推测是由于网络节点延迟,无法接入谷歌导致的。点击Cancel取消即可。...
【C语言篇】C 语言总复习(下):点亮编程思维,穿越代码的浩瀚星河
我的个人主页 我的专栏:C语言,希望能帮助到大家!!!点赞❤ 收藏❤ 在C语言的世界里,结构体和联合体以及文件操作都是非常重要且实用的知识板块,掌握它们能帮助我们更高效地组织数据以及与外部文…...
AI技术架构:从基础设施到应用
人工智能(AI)的发展,正以前所未有的速度重塑我们的世界。了解AI技术架构,不仅能帮助我们看懂 AI 的底层逻辑,还能掌握其对各行业变革的潜力与方向。 一、基础设施层:AI 技术的坚实地基 基础设施层是 AI 技…...
centos7的yum镜像源设置
sudo yum repolist 查看镜像源连接情况,not found即为连接失败 sudo cp -r /etc/yum.repos.d /etc/yum.repos.d.backup 备份镜像源文件 sudo nano /etc/yum.repos.d/CentOS-Base.repo 进入镜像源文件编辑内容 # CentOS-Base.repo # # The mirror system uses the…...
Qt6开发自签名证书的https代理服务器
目标:制作一个具备类似Fiddler、Burpsuit、Wireshark的https协议代理抓包功能,但是集成到自己的app内,这样无需修改系统代理设置,使用QWebengineview通过自建的代理服务器,即可实现https包的实时监测、注入等自定义功能…...
HarmonyOS:多线程并发-Worker
Worker主要作用是为应用程序提供一个多线程的运行环境,可满足应用程序在执行过程中与宿主线程分离,在后台线程中运行一个脚本进行耗时操作,极大避免类似于计算密集型或高延迟的任务阻塞宿主线程的运行。具体接口信息及使用方法详情请见Worker…...
小程序IOS安全区域优化:safe-area-inset-bottom
ios下边有一个小黑线,位于底部的元素会被黑线阻挡 safe-area-inset-bottom 一 用法及作用: IOS全面屏底部有小黑线,位于底部的元素会被黑线阻挡,可以使用以下样式: .model{padding-bottom: constant(safe-area-ins…...
C++ 中多态性在实际项目中的应用场景
C中的多态性是面向对象编程中的一个核心概念,它允许我们在使用基类指针或引用的情况下,调用派生类对象的特定方法。这种特性在实际项目中有着广泛的应用场景,具体包括但不限于以下几个方面: 1.图形图像处理: 在图形图…...
prettier配置
配置 Prettier 在 VSCode 中自动格式化代码的教程 1. 安装 Prettier VSCode 插件 打开 VSCode。点击左侧活动栏的扩展市场图标(或按 Ctrl+Shift+X)。在搜索栏中输入 Prettier - Code formatter。找到插件并点击 Install 安装它。2. 配置 VSCode 设置 确保 VSCode 配置正确,…...
【基于OpenEuler国产操作系统大数据实验环境搭建】
大数据实验环境搭建 一、实验简介1.1 实验内容1.2 环境及其资源规划 二、实验目的三、实验过程3.1 安装虚拟机软件及操作系统3.2 创建安装目录(在主节点上操作)3.2 安装JDK及基本设置(所有节点都需要操作)3.3 安装Hadoop3.4 安装Z…...
期末软件经济学
文章目录 前言复习策略复习名词解释简答题第一章 ppt后记 前言 最近白天都在忙正事,晚上锻炼一下,然后处理一些杂事,现在是晚上十点多,还有一些时间复习一下期末考试。复习到十一点。 复习策略 感觉比较简单,直接刷…...
amsmath宏包完全使用手册:从解决符号显示问题到专业公式排版
amsmath宏包完全使用手册:从解决符号显示问题到专业公式排版 在科研论文、技术文档或数学教材的写作过程中,LaTeX作为专业的排版工具已经成为学术界的标准选择。而数学公式的排版,则是LaTeX最引以为傲的功能之一。然而,即使是经验…...
用74LS175D和面包板,手把手教你做一个四人抢答器(附完整电路图)
从零搭建四人抢答器:74LS175D芯片实战指南 在电子技术学习过程中,没有什么比亲手搭建一个实际可用的电路更能加深理解了。今天,我们将使用经典的74LS175D芯片,配合面包板、LED和按键开关,一步步构建一个功能完整的四人…...
YOLOv8自定义检测头踩坑记:手把手教你修复‘NotImplementedError: new_detect task‘错误
YOLOv8自定义检测头实战:从报错到修复的深度解析 当你在YOLOv8框架中尝试添加一个名为new_detect的自定义检测头时,突然遇到NotImplementedError: new_detect task错误,这可能会让你感到困惑。本文将带你深入理解YOLOv8的任务调度机制&#x…...
告别重复代码:BaseMapperPlus在SpringBoot项目中的5个高级用法
BaseMapperPlus实战:SpringBoot项目中提升开发效率的5个高阶技巧 在SpringBoot项目中使用MyBatis-Plus进行数据持久层开发时,BaseMapperPlus作为社区广泛采用的扩展接口,能显著减少模板代码。本文将分享五个实际业务场景中的高阶用法…...
以太网MAC与PHY接口技术详解
以太网PHY、MAC及其通信接口技术解析1. 以太网接口架构概述1.1 基本组成结构以太网接口电路从硬件角度可分为两大核心组件:MAC控制器(Media Access Control):负责数据链路层的媒体访问控制PHY芯片(Physical Layer&…...
保研党必看:用本科论文逆袭IEEE二区期刊的5个关键操作(含时间管理秘籍)
保研党必看:用本科论文逆袭IEEE二区期刊的5个关键操作(含时间管理秘籍) 在保研竞争日益激烈的当下,一篇高质量的学术论文往往能成为决定成败的关键。对于大多数本科生来说,科研经历有限、资源匮乏是普遍面临的困境。但…...
避坑指南:.NET MAUI页面跳转最常见的5个坑点及解决方案(2023最新版)
.NET MAUI页面导航避坑实战:5个高频问题与工业级解决方案 刚接触.NET MAUI的开发者常会在页面跳转环节踩坑——传参莫名丢失、导航堆栈突然崩溃、模态窗口关闭失效...这些问题往往消耗大量调试时间。本文将结合GitHub高星issue和StackOverflow热帖,拆解5…...
KiCanvas:浏览器中的KiCAD设计查看器,5分钟快速入门指南
KiCanvas:浏览器中的KiCAD设计查看器,5分钟快速入门指南 【免费下载链接】kicanvas The KiCAD web viewer 项目地址: https://gitcode.com/gh_mirrors/ki/kicanvas 想要在浏览器中直接查看KiCAD电路设计文件,无需安装任何软件…...
OpenClaw开发辅助:Qwen3.5-9B实现日志分析与错误自动修复
OpenClaw开发辅助:Qwen3.5-9B实现日志分析与错误自动修复 1. 为什么需要AI辅助日志分析? 每次凌晨被报警短信吵醒,盯着密密麻麻的日志文件找异常时,我都会想:如果能有个AI助手帮我自动分析日志、定位问题甚至尝试修复…...
CANdb++ Editor高效使用技巧:5个隐藏功能大幅提升dbc编辑效率
CANdb Editor高效使用技巧:5个隐藏功能大幅提升dbc编辑效率 在汽车电子开发领域,Vector的CANdb Editor堪称dbc文件编辑的行业标准工具。大多数工程师都能熟练使用其基础功能,但真正的高手往往掌握着那些鲜为人知的"秘密武器"。本文…...
