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

MySQL 数据库事务实践

引言

在现代应用程序开发中,确保数据库操作的完整性和一致性至关重要。MySQL 提供了强大的事务管理功能,允许开发者以原子性、一致性、隔离性和持久性(ACID)的方式处理数据。本文将通过详细的解释和实际示例,带你深入了解 MySQL 事务的工作原理,并展示如何在实际项目中应用这些知识。

目录

什么是事务

事务的 ACID 特性

MySQL 中的锁机制

事务隔离级别

事务控制语句

实战演练

环境准备

开始事务

执行多个 SQL 语句

查看当前状态

提交事务

测试回滚

使用保存点

常见问题及解决方案

总结

参考文献


什么是事务

事务 是一系列作为一个整体执行的操作序列,要么全部成功,要么完全不执行。它提供了对数据库操作的一种可靠方式,确保数据的一致性和完整性。例如,在银行转账过程中,扣款和存款必须同时成功或失败,否则会导致资金丢失或重复。


事务的 ACID 特性
  • 原子性(Atomicity):事务是一个不可分割的工作单位,所有操作要么全部完成,要么一个也不做。
  • 一致性(Consistency):事务必须使数据库从一个一致状态转变到另一个一致状态,即使在发生故障的情况下也应如此。
  • 隔离性(Isolation):并发执行的多个事务不会互相干扰,每个事务都像是独立运行一样。
  • 持久性(Durability):一旦事务提交,其对数据库的更改将是永久性的,即使系统崩溃也不会丢失。

MySQL 中的锁机制

MySQL 使用多种类型的锁来保证并发操作的安全性和效率:

  • 表级锁:锁定整个表,适用于 MyISAM 和 MEMORY 存储引擎。
  • 行级锁:只锁定需要操作的行,适用于 InnoDB 存储引擎。
  • 页面锁:锁定一个页面(通常包含多行),介于表锁和行锁之间。
  • 意向锁:用于解决表级锁与行级锁之间的冲突。
  • 共享锁:允许多个事务读取同一行数据,但不允许修改。
  • 排他锁:允许事务更新或删除一行数据,但禁止其他任何事务对该行加任何类型的锁。
  • 间隙锁:锁定索引记录之间的“间隙”,防止幻读现象。
  • Next-Key 锁:结合了行锁和间隙锁的功能,有效地防止幻读。
  • 自增锁:用于控制 AUTO_INCREMENT 列值的分配。

事务隔离级别

MySQL 支持四种标准的事务隔离级别,每种级别决定了不同事务之间相互可见的程度:

  1. 读未提交(READ UNCOMMITTED):最低的隔离级别,允许脏读。
  2. 读已提交(READ COMMITTED):不允许脏读,但允许不可重复读。
  3. 可重复读(REPEATABLE READ):这是 InnoDB 的默认隔离级别,保证同一事务内的多次读取结果相同,防止不可重复读。
  4. 串行化(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 TRANSACTIONBEGIN 来显式地开始一个事务:

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 数据库事务实践

引言 在现代应用程序开发中&#xff0c;确保数据库操作的完整性和一致性至关重要。MySQL 提供了强大的事务管理功能&#xff0c;允许开发者以原子性、一致性、隔离性和持久性&#xff08;ACID&#xff09;的方式处理数据。本文将通过详细的解释和实际示例&#xff0c;带你深入…...

VScode、Windsurf、Cursor 中 R 语言相关快捷键设置

前言 在生物信息学数据分析中&#xff0c;R语言是一个不可或缺的工具。为了提高R语言编程效率&#xff0c;合理设置快捷键显得尤为重要。本文介绍在VSCode Windsurf Cursor 中一些实用的R语言快捷键设置&#xff0c;让非 Rstudio 的 IDE 用起来得心应手&#x1f611; 操作种…...

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&#xff0c; Linux远程访问方式有telnet、ssh两种协议&#xff1b;有人可能还会说vnc和rdp协议方式&#xff0c;后面这两种主要是可视化桌面场景下的&#xff0c;并非主流。 时过境迁&#xff0c;telnet因安全性低逐渐被禁用淘汰&#xff0c;最后就…...

算法刷题Day16: BM41 输出二叉树的右视图

题目链接 描述 思路&#xff1a; 递归构造二叉树在Day15有讲到。复习一下&#xff0c;就是使用递归构建左右子树。将中序和前序一分为二。 接下来是找出每一层的最右边的节点&#xff0c;可以利用队列层次遍历。 利用队列长度记录当前层有多少个节点&#xff0c;每次从队列里…...

登录授权的实现: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&#xff0c;coco,voc标记的睡岗检测数据集&#xff0c;可识别在桌子上趴着睡&#xff0c;埋头睡觉&#xff0c;座椅上靠着睡&#xff0c;平躺着睡等多种睡姿的检测&#xff0c;6549张图片 数据集分割 6549总图像数 训练组91&#xff05; 5949图片 有效集9&#x…...

数据库表的CRUD

SQL语句&#xff08;Structured Query Language&#xff09;是用于与关系型数据库进行交互的语言。下面是几个常用的SQL语句&#xff1a; 创建表&#xff1a; CREATE TABLE table_name ( column1 datatype, column2 datatype, column3 datatype, ... ); 插入数据&#xff1a; …...

Proxy与Reflect

监听对象操作 在Object中&#xff0c;可以通过defineProperty中的get&#xff0c;set进行监听&#xff0c; Proxy基本使用 有两个参数&#xff0c;第一个是要代理的对象&#xff0c;第二个是捕获器&#xff0c;在不知道捕获器使用哪个之前可以先传个空对象。就会启用默认的捕获…...

【安卓开发】【Android Studio】启动时报错“Unable to access Android SDK add-on list”

一、问题描述 在启动Android Studio时&#xff0c;软件报错&#xff1a;Unable to access Android SDK add-on list&#xff0c;报错截图如下&#xff1a; 二、原因及解决方法 初步推测是由于网络节点延迟&#xff0c;无法接入谷歌导致的。点击Cancel取消即可。...

【C语言篇】C 语言总复习(下):点亮编程思维,穿越代码的浩瀚星河

我的个人主页 我的专栏&#xff1a;C语言&#xff0c;希望能帮助到大家&#xff01;&#xff01;&#xff01;点赞❤ 收藏❤ 在C语言的世界里&#xff0c;结构体和联合体以及文件操作都是非常重要且实用的知识板块&#xff0c;掌握它们能帮助我们更高效地组织数据以及与外部文…...

AI技术架构:从基础设施到应用

人工智能&#xff08;AI&#xff09;的发展&#xff0c;正以前所未有的速度重塑我们的世界。了解AI技术架构&#xff0c;不仅能帮助我们看懂 AI 的底层逻辑&#xff0c;还能掌握其对各行业变革的潜力与方向。 一、基础设施层&#xff1a;AI 技术的坚实地基 基础设施层是 AI 技…...

centos7的yum镜像源设置

sudo yum repolist 查看镜像源连接情况&#xff0c;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代理服务器

目标&#xff1a;制作一个具备类似Fiddler、Burpsuit、Wireshark的https协议代理抓包功能&#xff0c;但是集成到自己的app内&#xff0c;这样无需修改系统代理设置&#xff0c;使用QWebengineview通过自建的代理服务器&#xff0c;即可实现https包的实时监测、注入等自定义功能…...

HarmonyOS:多线程并发-Worker

Worker主要作用是为应用程序提供一个多线程的运行环境&#xff0c;可满足应用程序在执行过程中与宿主线程分离&#xff0c;在后台线程中运行一个脚本进行耗时操作&#xff0c;极大避免类似于计算密集型或高延迟的任务阻塞宿主线程的运行。具体接口信息及使用方法详情请见Worker…...

小程序IOS安全区域优化:safe-area-inset-bottom

ios下边有一个小黑线&#xff0c;位于底部的元素会被黑线阻挡 safe-area-inset-bottom 一 用法及作用&#xff1a; IOS全面屏底部有小黑线&#xff0c;位于底部的元素会被黑线阻挡&#xff0c;可以使用以下样式&#xff1a; .model{padding-bottom: constant(safe-area-ins…...

C++ 中多态性在实际项目中的应用场景

C中的多态性是面向对象编程中的一个核心概念&#xff0c;它允许我们在使用基类指针或引用的情况下&#xff0c;调用派生类对象的特定方法。这种特性在实际项目中有着广泛的应用场景&#xff0c;具体包括但不限于以下几个方面&#xff1a; 1.图形图像处理&#xff1a; 在图形图…...

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 创建安装目录&#xff08;在主节点上操作&#xff09;3.2 安装JDK及基本设置&#xff08;所有节点都需要操作&#xff09;3.3 安装Hadoop3.4 安装Z…...

期末软件经济学

文章目录 前言复习策略复习名词解释简答题第一章 ppt后记 前言 最近白天都在忙正事&#xff0c;晚上锻炼一下&#xff0c;然后处理一些杂事&#xff0c;现在是晚上十点多&#xff0c;还有一些时间复习一下期末考试。复习到十一点。 复习策略 感觉比较简单&#xff0c;直接刷…...

2026奇点大会闭门报告流出:图像描述生成正面临“语义坍缩”危机,这4类业务场景已触发告警

第一章&#xff1a;2026奇点智能技术大会&#xff1a;图像描述生成 2026奇点智能技术大会(https://ml-summit.org) 核心任务与技术演进 图像描述生成&#xff08;Image Captioning&#xff09;在2026奇点智能技术大会上被确立为多模态理解的关键落地范式。本届大会展示的最新…...

第9章 函数-9.7 函数嵌套

Python支持函数嵌套&#xff0c;函数嵌套指的是在当前函数内再创建另外一个函数。函数在进行嵌套之后&#xff0c;需要注意4点&#xff0c;一是内层函数可以访问外层函数中的所有变量&#xff0c;但不能修改外层函数中该变量的值&#xff1b;二是外层函数可以访问内层函数中的全…...

从谷歌论文到手机相册:深度拆解HDR+爆照技术如何拯救你的夜景照片

从谷歌论文到手机相册&#xff1a;深度拆解HDR爆照技术如何拯救你的夜景照片 当你在昏暗的餐厅里试图拍下美食&#xff0c;或是面对城市夜景举起手机时&#xff0c;是否总被模糊、噪点和高光溢出的照片所困扰&#xff1f;这正是HDR技术要解决的痛点。不同于传统HDR通过曝光 bra…...

终极Alienware灯光风扇控制指南:用AlienFX Tools告别臃肿的AWCC

终极Alienware灯光风扇控制指南&#xff1a;用AlienFX Tools告别臃肿的AWCC 【免费下载链接】alienfx-tools Alienware systems lights, fans, and power control tools and apps 项目地址: https://gitcode.com/gh_mirrors/al/alienfx-tools 还在为Alienware Command C…...

如何免费解锁Cursor AI Pro功能:3个核心技巧完整指南

如何免费解锁Cursor AI Pro功能&#xff1a;3个核心技巧完整指南 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reached your tria…...

Microsoft Edge 浏览器下载文件时,提示【xxx可能会损害你的设备。是否仍要保留?】解决方案

一、问题Microsoft Edge 浏览器下载文件时&#xff0c;提示【xxx可能会损害你的设备。是否仍要保留&#xff1f;】当前浏览器版本147.0.3912.60(正式版本)(64位&#xff09;二、解决方案1、打开【开始】菜单&#xff0c;点击【设置】&#xff0c;选择【隐私和安全性】&#xff…...

全文降AI的好处有哪些?推荐3款支持全文处理的降AI工具

全文降AI的好处有哪些&#xff1f;推荐3款支持全文处理的降AI工具 2026年的毕业季&#xff0c;AI检测已经不是"可能查"而是"一定查"。从知网到维普&#xff0c;从万方到大雅&#xff0c;几乎所有主流检测平台都上线了AIGC检测功能。面对这种局面&#xff0…...

砸钱、站台、被拉黑:孙宇晨与特朗普家族的「塑料友谊」翻车了

撰文&#xff1a;Yangz&#xff0c;Techub News曾经把特朗普称为「加密行业恩人」的孙宇晨&#xff0c;这两天彻底翻脸了。4 月 12 日下午&#xff0c;孙宇晨突然发文炮轰由特朗普家族支持的 DeFi 项目 World Liberty Financial&#xff08;WLFI&#xff09;。他抛出了一连串指…...

Unlock Music音乐解锁工具:如何快速免费解锁各大平台加密音乐文件

Unlock Music音乐解锁工具&#xff1a;如何快速免费解锁各大平台加密音乐文件 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库&#xff1a; 1. https://github.com/unlock-music/unlock-music &#xff1b;2. https://git.unlock-music.dev/um/web 项目…...

Vue3 动态路由组件加载:后台字符串到前端懒加载组件的完美转换

前言 在后台管理系统中&#xff0c;菜单和路由信息通常存储在数据库里。当后台返回类似 views/menu/index.vue 这样的组件路径字符串时&#xff0c;前端如何将它转换为 Vue Router 可识别的动态加载组件&#xff1f;本文将通过实际项目代码&#xff0c;带你深入理解这一转换过程…...