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

MySQL TCL 事务控制

文章目录

  • 1.事务四大特性
  • 2.事务并发问题
  • 3.事务隔离级别
  • 4.隔离级别查看与设置
  • 5.动提交事务
    • 5.1 查看自动提交事务
    • 5.2 关闭或开启自动提交事务
  • 6.事务执行的基本流程
  • 7.设置事务的保存点
  • 参考文献

说到事务控制,先说一下数据库的事务是什么以及 MySQL 中我们必知的知识点。

1.事务四大特性

数据库事务(Database Transaction) ,是指对数据库的一系列操作组成的逻辑工作单元(Unit)。

并非任意的对数据库的操作序列都是数据库事务。数据库事务拥有以下四个特性,习惯上被称之为 ACID 特性。

(1)原子性(Atomicity)

事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。

(2)一致性(Consistency)

事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束,如主键约束、唯一约束和外键约束等。

(3)隔离性(Isolation)

多个事务并发执行时,一个事务的执行不应影响其他事务的执行。

(4)持久性(Durability)

已被提交的事务对数据库的修改应该永久保存在数据库中。

MySQL 中并非所有的数据库存储引擎都支持事务操作,比如 MyISAM 就不支持。所以,使用事务处理的时候一定要确定所操作的表示是否支持事务处理,可以通过查看建表语句来查看有没有指定事务类型的存储引擎。当然,事务处理是为了保障表数据原子性、一致性、隔离性、持久性。这些都是要消耗系统资源,要谨慎选择。

本文以数据库引擎 InnoDB 为例来演示命令行模式下事务的基本操作。

2.事务并发问题

在数据库操作中,为了有效保证并发读取数据的正确性,提出了事务隔离级别。

数据库是要被广大客户共享访问的,那么在数据库并发操作过程中很可能会出现一些不确定的情况。

(1)更新丢失(Update Lost)

更新结果别其他事务覆盖。

两个事务同时读取相同数据并分别修改后,一个事务的修改覆盖了另一个事务的修改。这是因为系统没有执行任何锁操作,因此并发事务没有被隔离开来。

第一类更新丢失(回滚丢失)。

比如 A 事务对某一列 +1,B 事务对某一列 +2。B 事务事务提交后,A 事务进行了回滚,导致 B 事务的更新丢失。

第二类更新丢失(逻辑丢失)。

比如 A 事务对某一列 +1,B 事务对某一列 +2,A B 事务执行完成后正常预期结果应该是某一列的值被 +3,但是 B 事务的结果覆盖了 A 事务,导致结果只被 +2,A 事务的更新丢失了。

(2)脏读(Dirty Read)

读取未提交数据。

A 事务读取 B 事务尚未提交的数据,此时如果 B 事务发生错误并执行回滚操作,那么 A 事务读取到的数据就是脏数据。

(3)不可重复读(Non-repeatable Read)

前后多次读取,数据内容不一致。

A 事务在 B 事务开始前读和 B 事务结束后读的数据不一样,因为数据被事务 B 给修改了。

(4)幻读(Phantom Read)

一个行出现在查询结果集中,但不在较早查询的结果集中。

事务 A 在读取某个范围内的记录时,事务 B 在该范围内插入了新记录,事务 A 再次读取该范围内的记录时,会产生幻行。

幻读比不可重复读取更难防范,因为锁定第一个查询结果集中的所有行并不能阻止导致幻像出现的更改。

为了解决上面的问题,于是有了事务隔离。

3.事务隔离级别

MySQL 提供了多个事务隔离级别,每个隔离级别都有不同的特点和能力,以解决并发访问数据库时可能出现的不同问题。

以下是 MySQL InnoDB 支持的四个 SQL:1992 标准定义的四个隔离级别及其解决的问题。

  1. 读未提交(Read Uncommitted)

不允许第一类更新丢失,允许脏读、不可重复读、幻读和第二类更新丢失。

最低的隔离级别,事务可以读取其他事务尚未提交的数据,虽然拥有超高的并发处理能力及很低的系统开销,但很少用于实际应用,因为可能导致数据不一致性。

  1. 读已提交(Read Committed):

不允许第一类更新丢失和脏读。允许不可重复读、第二类更新丢失和幻读。

事务只能读取已经提交的数据,避免了脏读问题,但可能导致不可重复读和幻读。

这是大多数数据库系统的默认隔离级别,但不是 MySQL 默认。

  1. 可重复读(Repeatable Read):

不允许第一类更新丢失、脏读、不可重复读和第二类更新丢失,允许幻读。

事务在整个事务期间保持一致的快照,其他事务的修改不会影响正在运行的事务,从而防止不可重复读问题。

这是 MySQL 默认的事务隔离级别。

  1. 串行化(Serializable):

解决所有事务并发问题。

最高的隔离级别,通过强制事务排序,使之不可能相互冲突,从而解决防止所有并发问题。

在这个级别,可以解决上面提到的所有并发问题,但可能导致大量的超时现象和锁竞争。最直观的体现就是,当数据库隔离级别设置为串行化后,A事务在未提交之前,B事务对A事务数据的操作都会被阻塞。通常数据库不会用这个隔离级别,我们需要其他的机制来解决这些问题:比如乐观锁和悲观锁机制。

下面表格总结了事务并发问题和四大隔离级别的关系。

隔离级别第一类更新丢失脏读不可重复读第二类更新丢失幻读
读未提交x
读未提交xx
读未提交xxxx
读未提交xxxxx

每个隔离级别都在一定程度上解决了并发访问可能导致的问题,但随着隔离级别提升,对并发性能的影响也越大,因为更高级别的隔离通常需要更多的锁和资源开销。因此,在选择隔离级别时,您需要根据应用的需求平衡一致性和性能,选择最适合您应用场景的隔离级别。

4.隔离级别查看与设置

(1)查看全局和当前会话的事务隔离级别。

# 查看全局
SELECT @@global.transaction_isolation; # 查看当前会话
SELECT @@transaction_isolation;
SELECT @@session.transaction_isolation; 
SHOW VARIABLES LIKE 'transaction_isolation';

从 MySQL 8.0 起,tx_isolation 变量被 transaction_isolation 变量替换了,所以请使用最新的变量 transaction_isolation。

(2)更改事务的隔离级别。

MySQL 提供了 SET TRANSACTION 语句,该语句可以改变单个会话或全局的事务隔离级别。

SET [GLOBAL | SESSION] TRANSACTIONtransaction_characteristic [, transaction_characteristic] ...transaction_characteristic: {ISOLATION LEVEL level| access_mode
}level: {REPEATABLE READ| READ COMMITTED| READ UNCOMMITTED| SERIALIZABLE
}access_mode: {READ WRITE| READ ONLY
}

不显示指明 SESSION 或 GLOBAL,默认是 SESSION,即设置当前会话的事务隔离级别。如果使用 GLOBAL 关键字,为之后的所有新连接设置事务隔离级别,需要 SUPER 权限来做这个。

比如更改当前会话事务隔离级别为读已提交。

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;# 或省略 SESSION
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;

也可以直接使用 SET 语句为变更系统变量 transaction_isolation 的值修改当前 session 的事务隔离级别。

SET transaction_isolation='READ-COMMITTED';

或者设置全局事务隔离级别为读已提交。

SET @@global.transaction_isolation='READ-COMMITTED';

5.动提交事务

5.1 查看自动提交事务

MySQL 默认事务操作模式是自动提交模式(autocommit )。

系统变量 @@autocommit 用来控制一条SQL语句提交后是否自动执行,默认值是1,表示在mysql命令行模式下每条增删改语句在键入回车后,都会立即生效,而不需要手动commit。我们可以把它关闭,关闭之后需要commit,SQL语句才会真正生效。

由于系统变量 autocommit 分会话系统变量与全局系统变量,所以查询的时候,最好区别是会话系统变量还是全局系统变量。

查看当前会话是否处于自动提交模式。

SELECT @@autocommit;
SELECT @@session.autocommit;
SHOW SESSION VARIABLES LIKE 'autocommit';

如果返回结果为 1 或 ON,则表示当前会话处于自动提交模式;如果返回结果为 0 或 OFF,则表示当前会话未处于自动提交模式。

如果想查看全局配置,可查看系统变量 @@global.autocommit。

SELECT @@global.autocommit;
SHOW GLOBAL VARIABLES LIKE 'autocommit';

5.2 关闭或开启自动提交事务

  1. 关闭自动提交事务。

MySQL默认自动提交事务,即除非显式的开启事务(BEGIN 或 START TRANSACTION),否则每条 SOL 语句都会被当做一个单独的事务自动执行。但有些情况下,我们需要关闭事务自动提交来保证数据的一致性。

关闭自动提交事务主要有两种方法。一种是临时关闭,只对当前会话有效。第二种是永久关闭,对所有会话有效。

第一种:临时关闭。

关闭当前会话的自动提交事务。

SET autocommit = 0;
SET @@autocommit = 0;
SET @@session.autocommit = 0;
SET SESSION autocommit = 0;

这样之后,所有增删改语句,都必须使用 commit 之后,才能生效。

第二种:永久关闭。

在 MySQL 中,要永久地关闭自动提交事务,必须在配置文件中进行设置,以便在每次启动 MySQL 服务器时都保持这个设置。

找到 MySQL 的配置文件。在大多数情况下,MySQL 的配置文件名为 my.cnf 或 my.ini,具体位置取决于您的操作系统和安装方式。

打开配置文件并找到 [mysqld] 部分,添加或修改下面的配置项。

[mysqld]
init_connect='SET autocommit=0'

保存,然后重新启动 MySQL 服务器即可生效。

  1. 开启自动提交事务。

如果需要,可以开启自动提交模式。

SET autocommit = 1;
SET @@autocommit = 1;
SET @@session.autocommit = 1;
SET SESSION autocommit = 1;

要想永久有效,需要将上面配置文件中的配置项init_connect='SET autocommit=0'删除或设置为 1 即可。

6.事务执行的基本流程

首先创建一个测试数据表,建表语句如下:

CREATE TABLE transaction_test(id int primary key)engine=InnoDB;
  1. 开启一个事务。
BEGIN;
# 或
START TRANSACTION;
  1. 执行一系列增删改语句。
INSERT INTO transaction_test VALUES(1);
  1. 手动提交或回滚。

事务回滚:

ROLLBACK;

回滚后我们查看数据表中的数据。

SELECT * FROM transaction_test;
Empty set (0.00 sec)

表中没有数据,回滚成功。

手动提交事务:

COMMIT;

提交后,再 ROLLBACK 则不能回滚了,数据已经插入到数据表了。这里需要注意的是,在当前会话中,我们还没有手动 COMMIT 提交事务的时候,表中的数据已经被插入了,但对于其它会话,如果事务隔离级别是 READ COMMITED,那么在 COMMIT 之前,查询不到新插入的记录。

7.设置事务的保存点

在 MySQL 中,您可以使用事务保存点(Savepoint)来标记事务中的一个特定位置,以便在事务进行过程中进行部分回滚。事务保存点可以在事务内部创建,并且可以用于回滚到该保存点之前的状态,而不影响事务中的其他操作。

  1. 设置折返点
SAVEPOINT identifier;
  1. 回滚至折返点
ROLLBACK [WORK] TO [SAVEPOINT] identifier

这将撤销从保存点创建后到当前位置之间的所有操作。

  1. 提交或继续事务。

如果您满意回滚后的状态,可以继续进行其他操作,并最终提交事务。

COMMIT; -- 提交事务

通过使用事务保存点,您可以更细粒度地控制事务的回滚操作,以适应复杂的业务需求。请注意,保存点只在当前事务内部有效,并且一旦事务提交或回滚,保存点将被清除。


参考文献

13.3 Transactional and Locking Statements
MySQL 8.0 Reference Manual :: MySQL Glossary
15.7.2.1 Transaction Isolation Levels - MySQL
13.3.7 SET TRANSACTION Statement
MySQL 8.0 Reference Manual :: 5.1.8 Server System Variables
脏读、不可重复读、幻读、两类丢失更新与四大隔离级别 - 51cto

相关文章:

MySQL TCL 事务控制

文章目录 1.事务四大特性2.事务并发问题3.事务隔离级别4.隔离级别查看与设置5.动提交事务5.1 查看自动提交事务5.2 关闭或开启自动提交事务 6.事务执行的基本流程7.设置事务的保存点参考文献 说到事务控制,先说一下数据库的事务是什么以及 MySQL 中我们必知的知识点…...

【Ubuntu】从Graylog到Grafana Loki:构建更强大的网络设备管理和监控系统

在将Graylog部署到生产环境时,我们遇到了一些问题,其中最主要的是无法安装MongoDB并且无法随时重启机器去修改BIOS设置来修复问题 【WARNING: MongoDB 5.0 requires a CPU with AVX support, and your current system does not appear to have that! 】。…...

[JavaWeb]【八】web后端开发-Mybatis

目录 一 介绍 二 Mybatis的入门 2.1 快速入门 2.1.1 准备SpringBoot工程 2.1.2 创建数据库mybatis以及对应库表user 2.1.3 创建User实体类 2.1.4 配置application.properties数据库连接信息 2.1.5 编写sql语句(注解方式) 2.1.6 测试运行 2.1.7 配…...

Flink源码之Checkpoint执行流程

Checkpoint完整流程如上图所示: JobMaster的CheckpointCoordinator向所有SourceTask发送RPC触发一次CheckPointSourceTask向下游广播CheckpointBarrierSouceTask完成状态快照后向JobMaster发送快照结果非SouceTask在Barrier对齐后完成状态快照向JobMaster发送快照结…...

【工具使用】Git的使用

dev代表开发版 1. git clone 命令 通过 git add <name> 对文件进行跟踪&#xff0c;把<name>加入到暂存区 git commit -m XXXXXXX 提交修改并补充XXXXX作为注释 “暂存”状态&#xff1a;出现了一些修改&#xff0c;但是还没有提交 对于Java来说&#xff0c;.cl…...

无涯教程-PHP Installation on Windows NT/2000/XP with IIS函数

在Windows Server上运行IIS的PHP的安装比在Unix上简单得多,因为它涉及的是预编译的二进制文件而不是源代码。 如果您打算在Windows上安装PHP,那么这是先决条件列表- 运行中的PHP支持的Web服务器。一个正确安装的PHP支持的数据库,如MySQL或Oracle等。(如果您打算使用的话) PHP…...

EureKa快速入门

EureKa快速入门 远程调用的问题 多个服务有多个端口&#xff0c;这样的话服务有多个&#xff0c;硬编码不太适合 eureKa的作用 将service的所有服务的端口全部记录下来 想要的话 直接从注册中心查询对于所有服务 每隔一段时间需要想eureKa发送请求 保证服务还存活 动手实践 …...

Sectigo EV代码签名申请步骤

一、EV代码签名申请前提 1、单位成立时间不低于&#xff1a;3个月 2、单位工商及企查查可查 3、单位经营正常 4、注册地址真实存在&#xff0c;禁止使用集中注册地址 5、企查查登记电话和邮箱&#xff0c;确定查询结果的电话可以接听、邮箱可以接收邮件&#xff0c;如果信…...

生信学院|08月25日《SOLIDWORKS PDM帮助企业对设计数据版本的管理应用》

课程主题&#xff1a;SOLIDWORKS PDM帮助企业对设计数据版本的管理应用 课程时间&#xff1a;2023年08月25日 14:00-14:30 主讲人&#xff1a;车立洋 生信科技 PDM专家 1、图纸&文档的版本管理对于企业的重要性 2、SolidWorks PDM对图纸&文档版本的管理 3、SolidW…...

vue页面转pdf后分页时文字被横向割裂

效果 预期效果 //避免分页被截断async outPutPdfFn (id, title) {const _t this;const A4_WIDTH 592.28;const A4_HEIGHT 841.89;// dom的id。let target document.getElementById(pdf);let pageHeight target.scrollWidth / A4_WIDTH * A4_HEIGHT;// 获取分割dom&#xf…...

数据结构——队列(C语言)

需求&#xff1a;无 本篇文章将解决一下几个问题&#xff1a; 队列是什么&#xff1f;如何实现一个队列&#xff1f;什么场景下会用队列&#xff1f; 队列的概念&#xff1a; 队列&#xff1a;一种只允许一端进行插入数据操作&#xff0c;在另一端进行删除操作的特殊线性表。…...

WGS84地球坐标系,GCJ02火星坐标系,BD09百度坐标系简介与转换 资料收集

野火 ATGM332D简介 高性能、低功耗 GPS、北斗双模定位模块 STM32 GPS定位_为了维护世界和平_的博客-CSDN博客 秉火多功能调试助手上位机开源&#xff01;共六款软件&#xff0c;学到你吐... , - 电脑上位机 - 野火电子论坛 - Powered by Discuz! https://www.firebbs.cn/for…...

【面试题】前端面试复习6---性能优化

前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 性能优化 一、性能指标 要在 Chrome 中查看性能指标&#xff0c;可以按照以下步骤操作&#xff1a; 打开 Chrome 浏览器&#xff0c;并访问你想要测试…...

隧道HTTP具备的条件

作为一名专业的爬虫代理供应商&#xff0c;我们都知道使用代理是保证爬虫的高效性和稳定性的重要手段之一。而隧道代理则是近年来备受推崇的一种代理形式&#xff0c;它通过将请求通过隧道传输&#xff0c;可以有效地隐藏爬虫的真实IP地址&#xff0c;提高爬虫的反爬能力。 在…...

部署FTP服务(二)

目录 2.访问FTP服务 1.使用ftp命令行工具 2.使用浏览器 3.使用FileZilla Client 3.Serv-U 1.定义新域 2.创建用户 4. windowsserver搭建ftp服务器 一、FTP工具 二、Windows资源管理器 三、IE浏览器访问 2.访问FTP服务 下面在一台装有Windows10操作系统的计算机中&#…...

缓存的变更(JVM本地缓存->Redis分布式缓存)

在一次需求修改中&#xff0c;下游的服务附加提出了&#xff0c;针对某个业务数据缓存的生效时间的要求 原JVM设计方案&#xff1a; 采用jvm本地缓存机制&#xff0c;定时任务30秒刷新一次 现在redis方案&#xff1a; 因为很多地方使用了这个业务数据缓存&#xff0c;使用方…...

springMVC Unix 文件参数变更漏洞修复

错误信息如下&#xff1a; 解决方案&#xff1a; 原因&#xff1a;未对用户输入正确执行危险字符清理 未检查用户输入中是否包含“…”&#xff08;两个点&#xff09;字符串&#xff0c;比如 url 为 /login?action…/webapps/RTJEKSWTN26635&typerandomCode cookie为Coo…...

【LeetCode】494.目标和

题目 给你一个非负整数数组 nums 和一个整数 target 。 向数组中的每个整数前添加 或 - &#xff0c;然后串联起所有整数&#xff0c;可以构造一个 表达式 &#xff1a; 例如&#xff0c;nums [2, 1] &#xff0c;可以在 2 之前添加 &#xff0c;在 1 之前添加 - &#x…...

KaiwuDB 荣获哈佛商业评论 2023“高能韧性团队奖”

8月18日&#xff0c;《哈佛商业评论》中文版携手 FESCO 成功举办“第九届人才经济论坛”暨“2022-2023 高能团队奖颁奖典礼”。论坛秉承前沿的全球视野及权威的管理理念&#xff0c;发掘并展示本土企业组织管理的最佳实践&#xff0c;并重磅揭晓第二届“高能团队奖”评选结果。…...

删除ubuntu开始菜单中的图标

背景 本来是很好看干净的界面 更新谷歌浏览器后出现了Gmail&#xff0c;幻灯片&#xff0c;谷歌硬盘等跟谷歌相关的乱七八糟东西搞得界面就很丑 解决问题 删掉那个图标 输入命令 sudo nautilus /usr/share/applicationssudo nautilus ~/.local/share/applications可以…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

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

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

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...