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

数据库 - MySQL的事务

目录

前言

一、事务的特性

(一)原子性

(二)一致性

(三)隔离性

(四)持久性

二、事务的控制语句

三、事务隔离级别

(一)读未提交

(二)读已提交

(三)可重复读

(四)可序列化

四、使用场景

五、事务操作

(一)开启事务

(二)提交事务

(三)回滚事务

(四)示例

六、自动提交模式

七、隐式提交

八、提交前的保存点

九、注意事项

十、总结


前言

MySQL 中的事务是数据库管理系统中用来确保多个 SQL 操作以原子性的方式执行的机制。事务可以保证一系列操作要么全部成功,要么全部失败,从而保证数据库的一致性和完整性。


一、事务的特性

事务具有四个重要的属性,简称 ACID

(一)原子性

事务中的所有操作要么全部成功,要么全部回滚到事务开始前的状态。如果事务中任何一个操作失败,整个事务都会回滚。

(二)一致性

事务的执行不会破坏数据库的一致性约束。即事务执行前后,数据库都应该处于一致的状态。

(三)隔离性

每个事务的操作在未提交之前,对其他事务是不可见的。事务相互独立,即使并发执行时,事务的执行结果与按顺序执行的结果应当一致。MySQL 通过不同的隔离级别来控制事务的并发执行行为。

(四)持久性

一旦事务提交,数据库中的数据就会被永久保存,即使系统崩溃,事务提交的结果也不会丢失。

二、事务的控制语句

控制语句主要有以下几种:

  • START TRANSACTIONBEGIN:显式开启一个事务。

  • COMMIT:提交事务,表示事务中的所有操作成功执行。

  • ROLLBACK:回滚事务,将数据库状态恢复到事务开始之前。

  • SAVEPOINT:设置一个保存点,以便在回滚时可以部分回滚到某个点。

  • RELEASE SAVEPOINT:删除保存点。

  • SET TRANSACTION:设置事务的隔离级别。

三、事务隔离级别

MySQL 支持四种事务隔离级别,每种级别对并发控制的严格程度不同:

(一)读未提交

事务可以读取其他事务未提交的数据,容易导致脏读的问题。

(二)读已提交

事务只能读取其他事务已经提交的数据,避免了脏读问题,但可能出现不可重复读。

(三)可重复读

事务执行期间,即使其他事务修改了数据,当前事务依然只能看到执行时的快照,避免了不可重复读问题。MySQL 的默认隔离级别是可重复读,同时通过间隙锁机制来防止幻读

(四)可序列化

最严格的隔离级别,所有事务串行化执行,完全避免了脏读、不可重复读和幻读,但并发性能较差。 

四、使用场景

事务通常用于涉及多表操作、转账系统等需要保证数据一致性的场景,例如:

  • 银行转账:从一个账户扣钱,并往另一个账户加钱,这两个操作必须作为一个原子操作执行,任何一个操作失败,整个事务都必须回滚。

  • 订单处理:生成订单时,可能涉及多个表的写操作,比如库存减少、账户扣款、订单创建等,这些操作需要作为一个事务处理。

五、事务操作

事务的开启和提交涉及到控制事务的生命周期。通过显式开启事务,并在事务内执行多个操作,可以确保这些操作要么全部执行成功并提交,要么在失败时回滚所有操作。

(一)开启事务

MySQL 中,可以通过 START TRANSACTIONBEGIN 语句显式开启一个事务。开启事务后,执行的 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 语句都会自动被作为一个独立的事务执行,并在执行后立即提交。要显式控制事务,就需要暂时关闭自动提交模式。

关闭自动提交模式

可以通过设置 autocommit0 来关闭自动提交:

SET autocommit = 0;

此时,MySQL 将不会自动提交操作,必须显式通过 COMMITROLLBACK 来结束事务。

-- 手动提交事务
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 都是独立事务;关闭自动提交后,必须手动调用 COMMITROLLBACK 来结束事务。

  • 在分布式数据库中或多个系统间的事务处理中,还可能涉及到分布式事务,通过二阶段提交(2PC)等机制来保证数据的一致性。

十、总结

  • 使用 START TRANSACTIONBEGIN 来显式开启事务。

  • 通过 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 参考以上资料,可对神经网络有初步了解。接下来可参考书籍等投身实际项目中使用。 书…...

<6>-MySQL表的增删查改

目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表&#xf…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来&#xf…...

作为测试我们应该关注redis哪些方面

1、功能测试 数据结构操作:验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化:测试aof和aof持久化机制,确保数据在开启后正确恢复。 事务:检查事务的原子性和回滚机制。 发布订阅:确保消息正确传递。 2、性…...

论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing

Muffin 论文 现有方法 CRADLE 和 LEMON,依赖模型推理阶段输出进行差分测试,但在训练阶段是不可行的,因为训练阶段直到最后才有固定输出,中间过程是不断变化的。API 库覆盖低,因为各个 API 都是在各种具体场景下使用。…...

SpringAI实战:ChatModel智能对话全解

一、引言:Spring AI 与 Chat Model 的核心价值 🚀 在 Java 生态中集成大模型能力,Spring AI 提供了高效的解决方案 🤖。其中 Chat Model 作为核心交互组件,通过标准化接口简化了与大语言模型(LLM&#xff0…...

DAY 26 函数专题1

函数定义与参数知识点回顾:1. 函数的定义2. 变量作用域:局部变量和全局变量3. 函数的参数类型:位置参数、默认参数、不定参数4. 传递参数的手段:关键词参数5 题目1:计算圆的面积 任务: 编写一…...

32单片机——基本定时器

STM32F103有众多的定时器,其中包括2个基本定时器(TIM6和TIM7)、4个通用定时器(TIM2~TIM5)、2个高级控制定时器(TIM1和TIM8),这些定时器彼此完全独立,不共享任何资源 1、定…...

__VUE_PROD_HYDRATION_MISMATCH_DETAILS__ is not explicitly defined.

这个警告表明您在使用Vue的esm-bundler构建版本时,未明确定义编译时特性标志。以下是详细解释和解决方案: ‌问题原因‌: 该标志是Vue 3.4引入的编译时特性标志,用于控制生产环境下SSR水合不匹配错误的详细报告1使用esm-bundler…...