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后记 前言 最近白天都在忙正事,晚上锻炼一下,然后处理一些杂事,现在是晚上十点多,还有一些时间复习一下期末考试。复习到十一点。 复习策略 感觉比较简单,直接刷…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...

算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...

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、结构体与…...
C语言中提供的第三方库之哈希表实现
一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...

Win系统权限提升篇UAC绕过DLL劫持未引号路径可控服务全检项目
应用场景: 1、常规某个机器被钓鱼后门攻击后,我们需要做更高权限操作或权限维持等。 2、内网域中某个机器被钓鱼后门攻击后,我们需要对后续内网域做安全测试。 #Win10&11-BypassUAC自动提权-MSF&UACME 为了远程执行目标的exe或者b…...

【Zephyr 系列 16】构建 BLE + LoRa 协同通信系统:网关转发与混合调度实战
🧠关键词:Zephyr、BLE、LoRa、混合通信、事件驱动、网关中继、低功耗调度 📌面向读者:希望将 BLE 和 LoRa 结合应用于资产追踪、环境监测、远程数据采集等场景的开发者 📊篇幅预计:5300+ 字 🧭 背景与需求 在许多 IoT 项目中,单一通信方式往往难以兼顾近场数据采集…...
Docker环境下安装 Elasticsearch + IK 分词器 + Pinyin插件 + Kibana(适配7.10.1)
做RAG自己打算使用esmilvus自己开发一个,安装时好像网上没有比较新的安装方法,然后找了个旧的方法对应试试: 🚀 本文将手把手教你在 Docker 环境中部署 Elasticsearch 7.10.1 IK分词器 拼音插件 Kibana,适配中文搜索…...

Unity-ECS详解
今天我们来了解Unity最先进的技术——ECS架构(EntityComponentSystem)。 Unity官方下有源码,我们下载源码后来学习。 ECS 与OOP(Object-Oriented Programming)对应,ECS是一种完全不同的编程范式与数据架构…...

SpringSecurity+vue通用权限系统
SpringSecurityvue通用权限系统 采用主流的技术栈实现,Mysql数据库,SpringBoot2Mybatis Plus后端,redis缓存,安全框架 SpringSecurity ,Vue3.2Element Plus实现后台管理。基于JWT技术实现前后端分离。项目开发同时采 …...