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后记 前言 最近白天都在忙正事,晚上锻炼一下,然后处理一些杂事,现在是晚上十点多,还有一些时间复习一下期末考试。复习到十一点。 复习策略 感觉比较简单,直接刷…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...
linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险
C#入门系列【类的基本概念】:开启编程世界的奇妙冒险 嘿,各位编程小白探险家!欢迎来到 C# 的奇幻大陆!今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类!别害怕,跟着我,保准让你轻松搞…...
BLEU评分:机器翻译质量评估的黄金标准
BLEU评分:机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域,衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标,自2002年由IBM的Kishore Papineni等人提出以来,…...
