当前位置: 首页 > 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;直接刷…...

滑动窗口算法专题

滑动窗口简介 滑动窗口就是利用单调性&#xff0c;配合同向双指针来优化暴力枚举的一种算法。 该算法主要有四个步骤 1. 先进进窗口 2. 判断条件&#xff0c;后续根据条件来判断是出窗口还是进窗口 3. 出窗口 4.更新结果&#xff0c;更新结果这个步骤是不确定的&#xff0c…...

基于Java的世界时区自动计算及时间生成方法

目录 前言 一、zoneinfo简介 1、zoneinfo是什么 2、zoneinfo有什么 二、在Java中进行时区转换 1、Java与zoneInfo 2、Java展示zoneInfo实例 3、Java获取时区ID 三、Java通过经纬度获取时区 1、通过经度求解偏移 2、通过偏移量计算时间 3、统一的处理算法 四、总结 …...

Excel + Notepad + CMD 命令行批量修改文件名

注意&#xff1a;该方式为直接修改原文件的文件名&#xff0c;不会生成新文件 新建Excel文件 A列&#xff1a;固定为 renB列&#xff1a;原文件名称C列&#xff1a;修改后保存的名称B列、C列&#xff0c;需要带文件后缀&#xff0c;为txt文件就是.txt结尾&#xff0c;为png图片…...

OpenGL 几何着色器高级应用

几何着色器高级应用 概念回顾 几何着色器(Geometry Shader)是 OpenGL 管线中的可选着色器阶段,位于顶点着色器(Vertex Shader) 和光栅化阶段 之间。 其核心功能是基于输入的图元(如点、线或三角形),生成新的图元,或对输入的图元进行修改。 几何着色器的执行是以图元…...

【Unity基础】Unity 2D实现拖拽功能的10种方法

方法1. 基于 Update 循环的拖拽方法 (DragDrop2D) 代码概述 using System.Collections; using System.Collections.Generic; using UnityEngine;public class DragDrop2D : MonoBehaviour {bool isDraggable;bool isDragging;Collider2D objectCollider;void Start(){objectC…...

duxapp中兼容多端的 BoxShadow 阴影组件

由于RN 安卓端对阴影的支持不太完善&#xff0c;使用这个组件可以实现阴影效果 在RN端是使用 react-native-fast-shadow 实现的 示例 import { BoxShadow, Text } from /duxui<BoxShadow><Text>这是内容</Text> </BoxShadow>Props 继承自Taro的View…...

服务器---centos上安装docker并使用docker配置jenkins

要在 Docker 中安装 Jenkins 并进行管理,可以按照以下步骤操作: 1. 安装 Docker 首先,确保你的系统已经安装了 Docker。如果尚未安装,可以使用以下命令进行安装: 在 CentOS 上安装 Docker sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://…...

Linux系统操作03|chmod、vim

上文&#xff1a; Linux系统操作02|基本命令-CSDN博客 目录 六、chmod&#xff1a;给文件设置权限 1、字母法 2、数字法&#xff08;用的最多&#xff09; 七、vim&#xff1a;代码编写和文本编辑 1、启动和退出 1️⃣启动 2️⃣退出 2、vim基本操作 六、chmod&#x…...

数据库同步中间件DBSyncer安装配置及使用

1、介绍 DBSyncer&#xff08;英[dbsɪŋkɜː]&#xff0c;美[dbsɪŋkɜː 简称dbs&#xff09;是一款开源的数据同步中间件&#xff0c;提供MySQL、Oracle、SqlServer、PostgreSQL、Elasticsearch(ES)、Kafka、File、SQL等同步场景。支持上传插件自定义同步转换业务&#xf…...

虚幻5描边轮廓材质

很多游戏内都有这种描边效果&#xff0c;挺实用也挺好看的&#xff0c;简单复刻一下 效果演示&#xff1a; Linethickness可以控制轮廓线条的粗细 这样连完&#xff0c;然后放到网格体细节的覆层材质上即可 可以自己更改粗细大小和颜色...

wordpress婚纱主题/站长之家app下载

Linux简单介绍 特性 完全开源多用户多任务系统 继承了UNIX多用户多任务的设计理念&#xff0c;允许多人同时上线工作&#xff0c;合理分配资源。安全稳定高效 严格的用户权限管理使不同使用者之间保持高度的保密性和安全性。支持多硬件平台 Linux是UNIX Like操作系统&#xff…...

网站建设与维护/如何线上推广自己产品

上一期提到&#xff1a;类似这种自动的数据类型转化被称作隐式类型强制转换 (implicit type coercion)。隐式类型强制转换会造成意外。仍然是上期使用过的例子&#xff0c;隐式类型强制转换造成的结果出现误差。为了避免出现意外&#xff0c;C提供了明式类型转换&#xff0c;允…...

网站开发代码无中文/开一个免费网站

这类问题不是必现的&#xff0c;部分系统会出现文档介绍了微信和qq的universal link情况一、微信universal link 验证问题例如&#xff1a;(1)Error DomainShareSDKErrorDomain Code200300 "(null)" UserInfo{SELregisterApp:universalLink:, error_code200300}(2)返…...

郑州郑州网站建设河南做网站公司/佛山今日头条

8.CRT终端操作 winscp软件&#xff08;上传软件到Linux服务器中&#xff0c;altp&#xff0c;还可以下载Linux的软件到本地&#xff09; # 0.准备工作安装CRT客户端工具,安装winscp工具# 1.设置linux获取ip地址 (编辑网络配置文件) vi /etc/sysconfig/network-scripts/ifcfg-…...

上海市建设安全协会网站一360/四年级摘抄一小段新闻

2020年10月17日 科研PPT注意要点&#xff1a; 1. 若要展示组图&#xff0c;可以先放一个整图&#xff0c;再放分图 2. 汇报完成的事情&#xff08;科研进展&#xff09;&#xff0c;应图文并茂&#xff0c;可以画上各种概念示意图或拍照示意图 3. PPT单页不要有太多的字&am…...

随州网站建设/如何提高网站排名seo

sed根据模式替换的命令格式是这样的&#xff1a; s/pattern/replacement/flags 其中flags可以写数字&#xff0c;数字是多少&#xff0c;就是第几个位置&#xff1a; 我们还是看栗子吧。 首先新建一个文件名为data的文本作为数据范例&#xff1a; test test test test tes…...