【MySQL进阶之路丨第十二篇】一文带你精通MySQL事务

一文说清楚 MySQL 的事务 事务是数据库中一组不可分割的操作单元,这组操作要么全部执行成功,要么全部执行失败。例如在电商系统中,创建订单时需要同时完成扣减库存、生成订单记录、扣减用户余额等操作,这些操作必须作为一个整体 —— 只要其中任何一步失败,所有操作都需要回滚,否则会导致数据混乱。事务的核心作用是保证数据的一致性和完整性,尤其在多用户并发操作数据库时,能有效解决因交叉操作导致的数据错误问题。事务是 MySQL 保证数据一致性的核心机制,其 ACID 特性确保了操作的可靠性,而隔离级别则平衡了一致性与并发性能。 阅读详情

引言

在这里插入图片描述

在上一篇中我们介绍了MySQL排序、分组、连接;在开发中,掌握Null值的处理、正则表达式的使用等语句是十分重要的。
这一篇我们使用命令行方式来帮助读者掌握MySQL中事务的操作。

上一篇链接:【MySQL进阶之路丨第十一篇】一文带你精通MySQL NULL值处理、正则表达式


MySQL事务

在MySQL中,事务(Transaction)是一组数据库操作的执行单元。事务可以将多个数据库操作(如插入、更新、删除等)组合成一个逻辑单元,在该单元中,要么所有操作都被成功执行,要么所有操作都不会执行。

举个例子:比如说,在人员管理系统中,你删除一个人员,你既需要删除人员的基本资料,也要删除和该人员相关的信息,如评论,文章等等,而这些数据库操作语句就构成了一个事务。

事务具有以下特性,通常被称为ACID属性:

1.原子性(Atomicity):事务中的操作要么全部成功提交,要么全部失败回滚。如果一个操作失败,整个事务将回滚到初始状态,所有已经执行的操作都将被撤销。

2.一致性(Consistency):事务在执行前和执行后,数据库必须保持一致性状态。这意味着事务的执行不能破坏数据库的完整性约束和业务规则。

3.隔离性(Isolation):事务的执行在逻辑上是相互隔离的,即一个事务的操作不应该被其他事务所干扰。每个事务应该感觉就像在独立操作数据库一样,即使有多个事务并发执行。

4.持久性(Durability):一旦事务提交成功,其结果应该持久保存在数据库中,并且对于系统故障或重新启动后仍然有效。

在MySQL中,要使用事务,你需要使用以下语句来开始、提交或回滚事务:

  • START TRANSACTION:用于开始一个新的事务。
  • COMMIT:用于提交事务,将所有操作结果永久保存到数据库中。
  • ROLLBACK:用于回滚事务,撤销已经执行的操作,将数据库恢复到事务开始之前的状态。
  • SAVEPOINT identifier:SAVEPOINT 允许在事务中创建一个保存点,一个事务中可以有多个 SAVEPOINT
  • RELEASE SAVEPOINT identifier:删除一个事务的保存点,当没有指定的保存点时,执行该语句会抛出一个异常。
  • ROLLBACK TO identifier:把事务回滚到标记点。
  • SET TRANSACTION:用来设置事务的隔离级别。InnoDB 存储引擎提供事务的隔离级别有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 和 SERIALIZABLE。

下面是一个使用事务的模板:

START TRANSACTION;

-- 执行一系列数据库操作
INSERT INTO table_name (column1, column2) VALUES (value1, value2);
UPDATE table_name SET column1 = value1 WHERE condition;
DELETE FROM table_name WHERE condition;

-- 根据需要进行提交或回滚
COMMIT; -- 提交事务,保存所有操作
-- or
ROLLBACK; -- 回滚事务,撤销所有操作

事务该怎么用呢?我举个例子你就懂了:

假设有两个表:users和orders,其中users表包含用户信息,orders表包含订单信息。

在这里插入图片描述在这里插入图片描述
我们希望在插入一条新的订单记录之前先检查用户是否存在。如果用户存在,我们会插入订单记录;如果用户不存在,将回滚事务并不插入订单记录。

现在,我们将使用事务来插入订单记录,并确保用户存在:

-- 开始事务
START TRANSACTION;

-- 检查用户是否存在
SELECT * FROM users WHERE id = 1;

-- 如果存在则插入订单记录
INSERT INTO orders (id, user_id, product) VALUES (1, 1, 'Product A');

-- 提交
COMMIT;

回显如下:

在这里插入图片描述

可以看到,事务执行成功。

接着我们看看事务执行不成功会怎么样:

-- 开始事务
START TRANSACTION;

-- 选择id为2的用户
SELECT * FROM users WHERE id = 2;

-- 如果存在则插入订单记录
INSERT INTO orders (id, user_id, product) VALUES (2, 2, 'Product B');

-- 提交
COMMIT;

可以看到orders表并没有变化:

在这里插入图片描述

这是因为id=2的用户不存在,事务将会回滚,插入订单记录的操作被撤销,数据库状态恢复到事务开始之前的状态。


总结

以上为 【MySQL进阶之路丨第十二篇】,带领读者掌握 MySQL事务,通过具体实操实现对MySQL数据库的深度理解。MySQL系列将持续更新,欢迎订阅收藏。

在这里插入图片描述

重启程序猿之《MySQL进阶-事务篇》 在 MySQL 中,事务是一组数据库操作的集合,这些操作要么全部成功执行,要么全部不执行,以确保数据库的一致性和完整性。在这个隔离级别下,事务 A 可能读取到事务 B 未提交的更新后的数据,如果事务 B 最终回滚,事务 A 读取的数据就是无效的,导致脏读。在这个隔离级别下,事务 A 多次查询余额结果相同,但如果按照新的条件查询,可能会发现多了新的记录,即幻读。事务 A 查询商品库存,事务 B 想要更新商品库存,在这个隔离级别下,事务 B 会被阻塞,直到事务 A 提交或回滚。 阅读详情

相关推荐

【3D目标检测】MMdetection3d——搭建IS-Fusion环境+nuScenes数据集训练

搭建IS-Fusion环境+nuScenes数据集训练

qq_44703886的博客 2323

【MySQL进阶之路丨第九篇】一文带你精通MySQL子句

MySQL 中的 WHERE 子句是用于在查询中筛选数据的部分。它允许您指定条件,以便仅返回满足条件的行。简单来说, WHERE 子句类似于程序语言中的 if 条件,根据 MySQL 表中的字段值来读取指定的数据。WHERE 子句还可以运用于 SQL 的 DELETE 或者 UPDATE 命令;与其他操作符和函数一起使用,如 `LIKE` 运算符用于模表名:要更新数据的表名。列名1, 列名2, ...:要更新的列名列表,以逗号分隔。值1, 值2, .

等风来 1万+

计组实验5:cache大小测量与 cache line 大小测量

前言 今天做了实验5,通过 c 语言测 cache 参数。其实按理来说挺简单的,只是我们班没给代码,纯靠自己。听说别的班有给代码 emm 因为《深入理解计算机系统》这本书上面给的代码是 Linux 平台下的,而且需要一个 fcyc2 头文件,可以在 https://github.com/fabiensanglard/CpuCacheMountainViewer 这里找到。 ⚠ 我没有在 Linux 下试过课本上面的代码。。。 我是在 win10 下测试的。。。 所以 。。。 我并不确定我的代码是否正确。

AKGWSB 's blog 1万+

【MySQL进阶之路丨第十篇】一文带你精通MySQL排序、分组、连接

MySQL中可以使用ORDER BY语句对查询结果进行排序。ORDER BY语句按照指定的列或表达式对结果进行排序,可以按升序(默认)或降序排列。模板如下:SELECT column1, column2, ...FROM tableORDER BY {{column}} {{order}};将需要排序的列名替换为{{column}},并将排序顺序(ASC或DESC)替换为{{order}}MySQL中可以使用ORDER BY语句对查询结果进行排序。ORDER BY语句按照指定的列或表达式

等风来 1万+

Unity新手必看:5分钟搞定TextMeshPro中文乱码,告别小方块(附7000+常用字库)

本文详细介绍了Unity中TextMeshPro中文乱码问题的解决方案,包括快速生成中文字体的步骤和优化技巧。通过使用支持中文的.ttf字体文件和自定义字符集,开发者可以在5分钟内解决TMP显示小方块的问题,提升游戏或应用的文本显示效果。

weixin_33095355的博客 363

Android 13 录音APK在后台无数据的处理

未获取到录音数据

chenchen4310的博客 1183

【MySQL进阶之路丨第十七篇】一文带你精通MySQL运算符(完结)

在上一篇中我们介绍了MySQL函数;在开发中,对MySQL运算符的运用是十分重要的。这一篇我们使用命令行方式来帮助读者掌握MySQL中运算符的操作。MySQL中的运算符可以分为数学运算符、比较运算符、逻辑运算符和位运算符等几类。 1.数学运算符: MySQL支持常见的数学运算符,如加号(+)、减号(-)、乘号(*)、除号(/)和取模运算符(%),它们可以用于对数字进行加、减、乘、除等基本数学运算。

等风来 9196

双目深度相机--10.双目视觉的主要步骤讲解分析

双目视觉技术通过模拟人眼原理,利用两个相机从不同视角采集图像,实现三维坐标计算。其核心流程包括:1)系统标定,消除相机畸变并建立坐标映射关系;2)图像同步采集与预处理;3)立体匹配,寻找左右图像对应点;4)基于视差图的深度计算;5)三维重建生成点云或网格模型;6)结果应用如目标测距、三维建模等。关键技术难点在于精确标定和准确匹配,这两步直接影响最终深度计算的精度。该技术广泛应用于自动驾驶、工业检测、VR等领域,实现了从二维图像到三维空间的精准转换。

AIoT深度探索者 | 嵌入式系统架构师 深耕物联网(IoT)与人工智能(AI)融合技术,聚焦​​边缘计算、图像开发、低功耗通信协议​​,致力于智能硬件,关注我获取最新技术文章信息与海量资源~ 625

【MySQL进阶之路丨第十六篇】一文带你精通MySQL函数

在上一篇中我们介绍了MySQL数据的导入与导出;在开发中,对MySQL函数的运用是十分重要的。这一篇我们使用命令行方式来帮助读者掌握MySQL中函数的操作。MySQL提供了很多内置函数,用于处理和操作数据库中的数据。本文给出部分函数描述及其实例。现在,假设我们想要创建一个新的列,用于显示每个产品的实际售价,如果该产品享受折扣,则应该显示折扣后的价格,否则显示原价。我们可以使用 IF() 函数来实现这一点,如下所示:

等风来 8476

实战避坑:基恩士KV8000 PLC与C#上位机链路通讯全流程实现(含ST代码+上位机源码)

本文详细讲解了基恩士KV8000 PLC与C#上位机的TCP链路通讯实现,从PLC端的ST代码编写、通讯配置,到上位机的通讯类封装、界面实现,再到实战避坑和性能优化,提供了完整的可复用方案。该方案已在实际产线项目中验证,支持实时数据采集和控制指令下发,稳定性和可靠性满足工业场景需求。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1177

Python爬虫实战:构建药监局药品批准信息本地查询系统

在医药信息化时代,药品批准信息的快速查询对于医药从业者、研究人员和普通消费者都具有重要意义。国家药品监督管理局(NMPA)提供了官方的药品查询系统,但有时我们需要建立本地数据库以便批量分析或离线查询。本文将详细介绍如何使用Python爬虫技术,结合最新的异步爬虫框架和技术栈,构建一个完整的药监局药品信息本地查询系统。本系统将实现以下功能:自动化爬取药监局官网的药品批准信息数据清洗和结构化存储建立本地查询接口数据定期更新机制pythonimport os"""药品类型枚举"""

2201_76125261的博客 728

【MySQL】事务是个啥?(一文带你了解 为什么要有事务、事务在mysql中的出现情况以及事务的四大特性)

本章承接上文将讲到mysql中另一大底层细节---《事务》,事务其实在每次的sql语句中都存在,只不过因为它的特性你并没有感知,并且它该解决了当多个人并发执行数据库时的一些数据不一致问题,保证了数据库效率的同时还防止了脏读、不可重复读和幻读的并发问题,下一章将继续更新事务的隔离性底层到底是如何实现的(Read View 和 MVCC 多版本控制器),敬请期待~

溟洵的博客 4023

关于如何在matlab中导入并翻译Hypemesh导出的大型刚度矩阵txt文本

如何将它翻译成matlab可以使用的矩阵变量,并参与运算。 由于这个大型刚度矩阵125万x125万≈1e12。matlab甚至其他计算软件无法保存这个大的一个矩阵文件。而这个刚度矩阵作为稀疏矩阵其中非零元素的数目只有有500多万。采用sparse稀疏矩阵技术是可以保存。 这里简单介绍一下这个Hypemesh导出的大型刚度矩阵txt文本。如图DMIG开头的标识符是换行符,后面两列是表示这条非零元素在刚度矩阵中列数的信息。我们已经将左边字母和符号等批量删除,得到了右边textread函数可以...

wenyusuran的专栏 1795

【MySQL】一文带你彻底了解事务机制

一个事情由n个单元组成,这n个单元在执行过程中,要么同时成功,要么同时失败,这就把n个单元放在了一个事务之中。

阿Q的小窝 2472

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

【MySQL进阶】MySQL事务详解

小杨带你学MySQL进阶内容事务的相关知识,一文让你掌握事务的四大特性,事务基本操作,事务隔离级别以及其的相关操作和三大事务并发问题。

小杨的博客 4012

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

一文带你了解MySQL之事务隔离级别和MVCC

并发的事务在运行过程中会出现一些可能引发一致性问题的现象

Multis 3837

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

【MySQL篇】事务的认识以及四大特性

脏读不可重复读和幻读都是由于并发事务互相干扰所导致的问题。为了避免这些问题,可以选择合适的事务隔离级别:读未提交:出现脏读,不可重复读,幻读。读已提交:防止脏读,但可能会出现不可重复读和幻读。可重复读:防止脏读和不可重复读,但可能会出现幻读。串行化:完全避免所有并发问题,但性能最差。

chaodddddd的博客 4175

【MySQL进阶之路丨第八篇】MySQL数据的插入及查询

在MySQL数据库中,使用 INSERT INTO 语句来插入数据。而INSERT INTO语法有两种常见的格式,是需要我们掌握的:1.插入单行数据:INSERT INTO 表名 (列1, 列2, 列3, ...) VALUES (值1, 值2, 值3, ...);例如,要向名为 “users” 的表中插入一条记录,包含id、name和email字段:INSERT INTO users (id, name, email) VALUES (1, 'John', 'john@example.

等风来 1万+

一文带你了解MySQL之事务的简介

事务(`Transaction`)是一组SQL组成的执行单元(Unit),是数据库并发控制和恢复回滚的基本单位。一个事务中可能包含多个SQL,要么都失败,要么都成功

Multis 1133

【MySQL进阶之路丨第十三篇】MySQL之ALTER命令及序列使用

使用 CHANGE 子句,语法有很大的不同。 在 CHANGE 关键字之后,紧跟着的是你要修改的字段名,然后指定新字段名及类型。我们可以使用 ADD 子句来向数据表中添加列,如下实例在表 testalter_tbl 中添加 i 字段,并定义数据类型

等风来 1万+

【MySQL数据库 | 第十五篇】事务

这章我们将进入到MySQL基础篇的最后一章:事务,希望大家可以坚持下去,跟着我一起走完MySQL的学习之旅。

fckbb的博客 4099

【从删库到跑路】一文带你明白MySQL数据库的 事务 操作

使用样例详细讲解MySQL数据库的事务操作

小吉妙妙屋 1290

『 MySQL篇 』:MySQL 事务特性

事务是一个有限的数据库操作序列构成,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位 。

m0_56361048的博客 1943

带你从入门到精通——MySQL(七. 事务、索引和视图)

索引(Index)是帮助MySQL高效获取数据的数据结构,MySQL中索引也叫做‘’键(Key)”,它是一个特殊的文件,它保存着数据表里所有记录的位置信息,我们可以使用索引快速定位到某条记录的位置,并去到该位置获取此条记录,这比起按顺序暴力搜索所有记录的方法要更加高效,注意只有在大量数据中查询时索引才显得有意义。主键索引:建立在主键上的索引被称为主键索引,一张数据表只能有一个主键索引,索引列值不允许有空值,不允许重复,通常在创建表时一起创建。事务是一组操作的集合,它是一个不可分割的工作单位。

2401_86480334的博客 1239

一文搞懂MySQL XA如何实现分布式事务

一文搞懂MySQL XA如何实现分布式事务前言XA 协议如何通过MySQL XA实现分布式事务 前言 MySQL支持单机事务的良好表现毋庸置疑,那么在分布式系统中,涉及多个节点,MySQL又是如何实现分布式事务的呢?比如开发一个业务系统,它接受外部的请求,然后访问多个内部其它系统才能执行该请求。执行时我们需要同时更新多个数据库的值(D1,D2,D3)。由于系统必须处于一个一致性,也就是这三个数据库的值要么同时更新成功,要么全部不更新。不然会造成子系统有些指令成功了,有些指令尚未执行。导致对结果理解混乱。 那

神技圈子的博客 6184

Mysql进阶-事务&锁

事务 是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。就比如: 张三给李四转账1000块钱,张三银行账户的钱减少1000,而李四银行账户的钱要增加 1000。这一组操作就必须在一个事务的范围内,要么都成功,要么都失败。为了避免DML在执行时,加的行锁与表锁的冲突,在InnoDB中引入了意向锁,使得表锁不用检查每行 数据是否加锁,使用意向锁来减少表锁的检查。

weixin_64133130的博客 1521
上一篇: 【C/PTA】循环结构专项练习(编程)
下一篇: 【MySQL进阶之路丨第十三篇】MySQL之ALTER命令及序列使用
秋说
秋说 优质创作者: 编程框架、信息安全技术领域 优质创作者: 编程框架、信息安全技术领域
博客等级 码龄4年 3万+粉丝 1906原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋说

感谢打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值