数据库 - MySQL的事务
目录
前言
一、事务的特性
(一)原子性
(二)一致性
(三)隔离性
(四)持久性
二、事务的控制语句
三、事务隔离级别
(一)读未提交
(二)读已提交
(三)可重复读
(四)可序列化
四、使用场景
五、事务操作
(一)开启事务
(二)提交事务
(三)回滚事务
(四)示例
六、自动提交模式
七、隐式提交
八、提交前的保存点
九、注意事项
十、总结
前言
MySQL 中的事务是数据库管理系统中用来确保多个 SQL 操作以原子性的方式执行的机制。事务可以保证一系列操作要么全部成功,要么全部失败,从而保证数据库的一致性和完整性。
一、事务的特性
事务具有四个重要的属性,简称 ACID:
(一)原子性
事务中的所有操作要么全部成功,要么全部回滚到事务开始前的状态。如果事务中任何一个操作失败,整个事务都会回滚。
(二)一致性
事务的执行不会破坏数据库的一致性约束。即事务执行前后,数据库都应该处于一致的状态。
(三)隔离性
每个事务的操作在未提交之前,对其他事务是不可见的。事务相互独立,即使并发执行时,事务的执行结果与按顺序执行的结果应当一致。MySQL 通过不同的隔离级别来控制事务的并发执行行为。
(四)持久性
一旦事务提交,数据库中的数据就会被永久保存,即使系统崩溃,事务提交的结果也不会丢失。
二、事务的控制语句
控制语句主要有以下几种:
-
START TRANSACTION
或BEGIN
:显式开启一个事务。 -
COMMIT
:提交事务,表示事务中的所有操作成功执行。 -
ROLLBACK
:回滚事务,将数据库状态恢复到事务开始之前。 -
SAVEPOINT
:设置一个保存点,以便在回滚时可以部分回滚到某个点。 -
RELEASE SAVEPOINT
:删除保存点。 -
SET TRANSACTION
:设置事务的隔离级别。
三、事务隔离级别
MySQL 支持四种事务隔离级别,每种级别对并发控制的严格程度不同:
(一)读未提交
事务可以读取其他事务未提交的数据,容易导致脏读的问题。
(二)读已提交
事务只能读取其他事务已经提交的数据,避免了脏读问题,但可能出现不可重复读。
(三)可重复读
事务执行期间,即使其他事务修改了数据,当前事务依然只能看到执行时的快照,避免了不可重复读问题。MySQL 的默认隔离级别是可重复读,同时通过间隙锁机制来防止幻读
(四)可序列化
最严格的隔离级别,所有事务串行化执行,完全避免了脏读、不可重复读和幻读,但并发性能较差。
四、使用场景
事务通常用于涉及多表操作、转账系统等需要保证数据一致性的场景,例如:
-
银行转账:从一个账户扣钱,并往另一个账户加钱,这两个操作必须作为一个原子操作执行,任何一个操作失败,整个事务都必须回滚。
-
订单处理:生成订单时,可能涉及多个表的写操作,比如库存减少、账户扣款、订单创建等,这些操作需要作为一个事务处理。
五、事务操作
事务的开启和提交涉及到控制事务的生命周期。通过显式开启事务,并在事务内执行多个操作,可以确保这些操作要么全部执行成功并提交,要么在失败时回滚所有操作。
(一)开启事务
MySQL 中,可以通过 START TRANSACTION
或 BEGIN
语句显式开启一个事务。开启事务后,执行的 SQL 操作会被暂时保留,直到提交或回滚。
START TRANSACTION
:这是标准的 SQL 语法,用于启动一个新的事务。
START TRANSACTION;
BEGIN
:MySQL 提供的简写形式,与 START TRANSACTION
等效,用于开启事务。
BEGIN;
此时,MySQL 开始记录事务中的所有操作,直到你决定提交或回滚事务。
(二)提交事务
提交事务意味着将事务中的所有操作永久保存到数据库中。使用 COMMIT
语句可以提交当前事务。
COMMIT;
当事务被提交后,所有的修改都会生效,并且这些修改会对其他事务可见。同时,提交后事务就结束了,后续的操作会作为一个新的事务来处理。
(三)回滚事务
如果在事务过程中发生了错误,或者你决定不保存这些操作的结果,可以使用 ROLLBACK
语句回滚事务。回滚意味着撤销事务中的所有操作,数据库会恢复到事务开始之前的状态。
ROLLBACK;
回滚操作通常用于防止因事务部分失败而导致数据库处于不一致状态。
(四)示例
以下是一个典型的事务使用流程,演示如何开启事务、执行多条操作,并根据情况提交或回滚事务。
-- 1. 显式开启事务
START TRANSACTION;-- 2. 执行多个 SQL 操作
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;-- 3. 提交事务(保存所有更改)
COMMIT;-- 如果某个操作失败,可以回滚整个事务
-- ROLLBACK;
六、自动提交模式
默认情况下,MySQL 处于自动提交模式,这意味着每一条 SQL 语句都会自动被作为一个独立的事务执行,并在执行后立即提交。要显式控制事务,就需要暂时关闭自动提交模式。
关闭自动提交模式
可以通过设置 autocommit
为 0
来关闭自动提交:
SET autocommit = 0;
此时,MySQL 将不会自动提交操作,必须显式通过 COMMIT
或 ROLLBACK
来结束事务。
-- 手动提交事务
COMMIT;-- 手动回滚事务
ROLLBACK;
恢复自动提交模式
在完成事务处理后,你可以将 autocommit
设置为 1
,恢复默认的自动提交行为:
SET autocommit = 1;
七、隐式提交
某些 SQL 语句会导致事务隐式提交,即不需要显式调用 COMMIT
,事务会自动提交。常见的隐式提交操作包括:
-
DDL 操作(如
CREATE
,DROP
,ALTER
等)会在执行前自动提交事务,且在执行后也会自动提交。
示例:
-- 创建表之前,事务会自动提交
CREATE TABLE new_table (id INT);
八、提交前的保存点
在事务中,可以通过 SAVEPOINT
设置一个保存点,便于部分回滚事务。如果不想回滚整个事务,可以使用保存点回滚到某个特定的点。
示例:
-- 开启事务
START TRANSACTION;-- 设置保存点
SAVEPOINT sp1;-- 执行一些操作
INSERT INTO orders (order_id, customer_id, total_amount) VALUES (1002, 1, 300);-- 回滚到保存点 sp1
ROLLBACK TO sp1;-- 提交事务
COMMIT;
九、注意事项
事务的注意事项主要有以下几点:
-
提交事务后,所有的更改将会永久保存,无法再通过
ROLLBACK
撤销。 -
自动提交模式默认开启时,每条 SQL 都是独立事务;关闭自动提交后,必须手动调用
COMMIT
或ROLLBACK
来结束事务。 -
在分布式数据库中或多个系统间的事务处理中,还可能涉及到分布式事务,通过二阶段提交(2PC)等机制来保证数据的一致性。
十、总结
-
使用
START TRANSACTION
或BEGIN
来显式开启事务。 -
通过
COMMIT
提交事务,永久保存修改。 -
如果事务中发生了问题,可以通过
ROLLBACK
撤销操作,恢复数据库到事务开始前的状态。 -
在 MySQL 默认的自动提交模式下,所有操作会被自动提交,如果需要手动控制事务,必须关闭自动提交模式。
相关文章:
数据库 - MySQL的事务
目录 前言 一、事务的特性 (一)原子性 (二)一致性 (三)隔离性 (四)持久性 二、事务的控制语句 三、事务隔离级别 (一)读未提交 (二&…...

【Python机器学习】NLP信息提取——提取人物/事物关系
目录 词性标注 实体名称标准化 实体关系标准化和提取 单词模式 文本分割 断句 断句的方式 使用正则表达式进行断句 词性标注 词性(POS)标注可以使用语言模型来完成,这个语言模型包含词及其所有可能词性组成的字典。然后,该…...

vector类
一、STL库 vector 1.1 vector的介绍 vector英文意思为向量:向量是表示大小可以改变的数组的序列容器。 指向其元素的常规指针上的偏移量来访问其元素,并且与数组中的效率一样高。但与数组不同,它们的大小可以动态变化,其存储由容…...

python常见的魔术方法
什么是魔术方法 Python类的内置方法,各自有各自的特殊功能,被称之为魔术方法 常见的魔术方法有以下: __init__:构造方法 __str__:字符串方法 __lt__:小于、大于符号比较 __le__:小于等于、大于等于符合比较 __eq__:等于符合比较__init__ c…...

自动化测试常用函数:弹窗、等待、导航、上传与参数设置
目录 一、弹窗 1. 警告弹窗确认弹窗 2. 提示弹窗 二、等待 1. 强制等待 2. 隐式等待 3. 显示等待 三、浏览器导航 1. 打开网站 2. 浏览器的前进、后退、刷新 四、文件上传 五、浏览器参数设置 1. 设置无头模式 2. 页面加载策略 一、弹窗 弹窗是在页面是找不到任何…...

【必看】2024国赛选题分布情况分析及数模国赛答辩指南~答辩不走弯路
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ 紧张刺激的数模国赛已经过去一段时间,各赛区的成绩发布也在陆续进…...

微服务注册中⼼1
1. 微服务的注册中⼼ 注册中⼼可以说是微服务架构中的”通讯录“ ,它记录了服务和服务地址的映射关系。在分布式架构中, 服务会注册到这⾥,当服务需要调⽤其它服务时,就这⾥找到服务的地址,进⾏调⽤。 1.1 注册中⼼的…...
我设置了路由器自动切换ip,这会让我的账号登录地址经常改变吗
是的,路由器设置自动切换IP可能会导致你的账号登录地址经常改变。 这是因为当路由器切换IP时,外部网络所看到的你的设备IP地址也会随之改变。对于很多跨境电商、社交媒体或者银行账户等需要较高安全性的系统来说,经常变动的IP地址可能会被视…...
Nginx 限流实战教程和技巧
Nginx限流是一种重要的技术手段,用于保护服务器资源,防止因过度请求而导致的服务不可用。以下是一个详细的Nginx限流教程,包括限流原理、常用模块和配置示例。 一、Nginx限流原理 Nginx限流主要基于两种算法:漏桶算法和令牌桶算…...

AlphaFold3 | 详解 AlphaFold3 的模型结构及其在不同类型的预测实验中的表现
Jumper 本文将介绍 24 年 5 月发布的 Alaphafold3,其以“使用 AlphaFold 3 进行生物分子相互作用的精确结构预测”为标题发表在《nature》上,通讯作者为 Jumper。 Jumper 具有物理、化学、生物和计算方面的丰富背景。Jumper 本科学的是物理和数学&#…...

公交IC卡收单管理系统 多处 SQL注入致RCE漏洞复现
0x01 产品简介 公交IC卡收单管理系统是城市公共交通领域中不可或缺的一部分,它通过集成先进的集成电路技术(IC卡)实现了乘客便捷的支付方式,并有效提高了公共交通运营效率。系统集成了发卡、充值、消费、数据采集、查询和注销等多个功能模块,为公交公司和乘客提供了全面、…...

淘客系统开发之卷轴模式系统源码功能分析
随着互联网技术的快速发展,电商行业不断创新,探索更加高效、有趣的用户参与机制。其中,卷轴模式作为一种新兴的商业模式,以其独特的积分兑换和任务系统,在淘客系统开发中得到了广泛应用。本文将从技术角度,…...
MoCo中的字典
在 MoCo(Momentum Contrast)中,字典(dictionary)是一个核心组件,用于存储负样本(negative samples)的特征表示(key)。这个字典的设计使得 MoCo 可以高效地利用…...

Xcode16 iOS18 编译问题适配
问题1:ADClient编译报错问题 报错信息 Undefined symbols for architecture arm64:"_OBJC_CLASS_$_ADClient", referenced from:in ViewController.o ld: symbol(s) not found for architecture arm64 clang: error: linker command failed with exit co…...
加密解密的艺术:探索Java中的DES算法
目录 1. 引言 2. DES算法简介 3. Java中的DES实现 4. 代码解析 5. 安全性考量 1. 引言 在数字化时代,数据安全变得至关重要。无论是个人隐私还是企业机密,都需要强有力的保护措施。今天,我们将探讨一种经典的数据加密技术——DES&#…...

jQuery——层次选择器
1、层次选择器:查找子元素,后代元素,兄弟元素的选择器。 ancestor descendant:在给定的祖先元素下匹配所有的后代元素 parent > child:在给定的父元素下匹配所有的子元素 prev next:匹配所有紧接在…...

MySQL常见面试总结
MySQL基础 什么是关系型数据库? 顾名思义,关系型数据库(RDB,Relational Database)就是一种建立在关系模型的基础上的数据库。关系模型表明了数据库中所存储的数据之间的联系(一对一、一对多、多对多&…...

记录一次学习--委派攻击学习
目录 为什么要使用委派 什么账号可以使用委派 非约束性委派 这里有一张图 利用 流程 约束性委派 这里有一张图 如何利用 条件 具体流程 为什么要使用委派 这个是因为可能A服务需要B服务的支持,但是A服务的权限不可以使用B服务。然后这时就可以让域用户将…...
前端列表数据太多导致页面卡顿就这么处理
前端列表数据太多页面卡顿就这么处理 实际场景什么是虚拟列表虚拟列表实现原理实战中虚拟列表的问题及相应解决方案 实际场景 首先看以下两个实际场景: 场景一:有一个数据列表,数据量非常大且每一个数据项都有几十列甚至更多,且后…...

机器学习_神经网络_深度学习
【神经网络——最易懂最清晰的一篇文章 - CSDN App】https://blog.csdn.net/illikang/article/details/82019945?type=blog&rId=82019945&refer=APP&source=weixin_45387165 参考以上资料,可对神经网络有初步了解。接下来可参考书籍等投身实际项目中使用。 书…...

铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...

C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

手机平板能效生态设计指令EU 2023/1670标准解读
手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读,综合法规核心要求、最新修正及企业合规要点: 一、法规背景与目标 生效与强制时间 发布于2023年8月31日(OJ公报&…...
Vue 模板语句的数据来源
🧩 Vue 模板语句的数据来源:全方位解析 Vue 模板(<template> 部分)中的表达式、指令绑定(如 v-bind, v-on)和插值({{ }})都在一个特定的作用域内求值。这个作用域由当前 组件…...