【MySQL数据库】事务

目录

1,事务的详细介绍

2,事务的属性

3,事务常见的操作方式


1,事务的详细介绍

        在MySQL数据库中,事务是指一组SQL语句作为一个指令去执行相应的操作,这些操作要么全部成功提交,对数据库产生影响;要么全部失败回滚(撤销当前事务所做的更改),不对数据库产生任何影响。事务确保了数据库的一致性和完整性,即保证了不同的客户端看到的数据是不相同的,以下是事务的通俗说明:

        事务就是要做的或所做的事情,主要用于处理操作量大,复杂度高的数据。假设一种场景:你毕业了,学校的教务系统后台 MySQL 中,不在需要你的数据,要删除你的所有信息,那么要删除你的基本信息(姓名,电话,籍贯等)的同时,也删除和你有关的其他信息,比如:你的各科成绩等。这样,就需要多条 MySQL 语句构成,那么所有这些操作合起来,就构成了一个事务。

        为什么要有事务呢?事务本质是为了当应用程序访问数据库的时候,事务能够简化我们的编程模型,不需要我们去考虑各种各样的潜在错误和并发问题。事务不仅保证了数据的一致性和完整性,还提高了系统的可靠性。通过正确地使用事务,可以有效地管理和维护数据库的状态。总的来说,事务是数据库管理系统中不可或缺的一部分。

        注意:在 MySQL 中,只有使用了 Innodb 存储引擎的数据库或表才支持事务。

2,事务的属性

        一个 MySQL 数据库上,可不止一个事务在运行,同一时刻,甚至有大量的请求被包装成事务,在向 MySQL 服务器发起事务处理请求。而每条事务至少一条 SQL,甚至有更多个 SQL,如果大家都访问同样的表数据,在不加保护的情况,就绝对会出现问题。因为事务由多条 SQL 构成,所以这里就会出现很多问题,比如 SQL 执行到一半出错或中途停止往后执行的情况。因此,一个完整的事务,绝对不是简单的 sql 集合,还拥有四个属性:

  1. 原子性:事务是一个不可分割的工作单位,要么全部完成,要么全部不完成,不会在中间某个环节结束。若事务在执行过程中发生错误,它就会被回滚到事务开始前的状态,就像这个事务从来没有执行过一样。
  2. 一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、关联性,以及后续数据库可以自发性地完成事先预定的工作。
  3. 隔离性:一个事务所做的修改在最终提交以前,对其它事务是不可见的。数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。
  4. 持久性:事务处理结束后,其所做的修改就会永久保存在数据库中。

        事务的四个属性可以简称为 ACID。

3,事务常见的操作方式

1,事务的提交方式

        事务的提交方式常见的有两种:自动提交手动提交

        自动提交意味着每执行完一条语句,MySQL 会自动将更改指令提交到数据库,使更改永久化。自动提交方式下,这里的每个单独 SQL 语句都被视为一个独立的事务,在执行后会立即被提交到数据库。

        手动提交意味着,在你执行一系列的 SQL 语句之后,需要手动执行指令(commit指令)来提交事务,使所有更改生效。具体的流程后面运用时会说明。   

查看事务的提交方式:show variables like 'autocommit';

        上面图中,ON表示自动提交,OFF表示手动提交。默认情况下是自动提交(ON)。 

修改事务的提交方式,用 set 指令:set autocommit=0;       

说明:0表示禁止自动提交,1表示开启自动提交                                                        

        注意:上面操作选择手动提交和自动提交时,仅是对当前会话的操作,其它终端启动时仍是MySQL 默认的情况。 

2,事务的隔离

        事务的隔离是指事务的隔离性,它确保了不同的事务在并发执行时不会互相干扰。事务的隔离并不是将所有的数据都隔离,因为不同的事务之间可能存在联系,因此,在数据库中,允许事务受不同程度的干扰,就有了一种重要特征:隔离级别

        MySQL支持四种标准的事务隔离级别:

        读未提交:这是最低的隔离级别,在这个级别上,事务可以读取未被其他事务提交的数据,这可能会出现脏读,即一个事务能够看到另一个事务尚未提交的更改,导致事务读取到的数据是一个临时数据或错误数据。(实际生产中不可能使用这种隔离级别的,它相当于没有提供事务间的隔离)

        读提交:事务只能读取已经被其他事务提交的数据,也就是说事务没有提交之前,其它正在运行的事务都是看不到的。这种隔离级别会引起不可重复读,也就是同一个事务在不同时间点读取同一行数据可能会得到不同的结果,例如:事务A提交了数据,那么事务B就会看到已经被事务A修改过的数据,原本的数据已经被修改了。

        可重复读:这是 MySQL 默认的隔离级别。在这个级别上,一个事务在执行中,多次读取操作数据时,会看到同样的数据行,即使其他事务对数据进行了修改并提交。这意味着在一个事务开始后,它将不会看到其他事务所做的任何更改,从而避免了不可重复读的问题。不过,在此隔离级别下,仍然可能存在幻读问题,即在同一事务中两次查询可能得到不同的行集合,通常是因为其他事务插入了记录(其他事务的插入操作,可重复读无法屏蔽其操作)。例如:事务A提交了数据,事务B看到的数据仍然是最开始的数据,即便事务A修改了此数据,除非结束事务B。

        串行化:这是事务的最高隔离级别,它通过强制事务排序,使之不可能相互冲突, 从而解决了幻读的问题。具体操作是,它在每个读取操作上都会加上共享锁,导致事务按顺序执行,这会极大地降低性能,并发度最低,因为可能会导致超时和锁竞争。(这种隔离级别太极端,实际生产基本不使用)

3,设置事务的隔离级别

        四种隔离级别:READ UNCOMMITTED(读未提交)、READ COMMITTED(读已提交)、REPEATABLE READ(可重复读)、SERIALIZABLE(可串行化)。默认情况下,MySQL数据库对应的是REPEATABLE READ(可重复读)

查看当前会话的事务隔离级别(只影响当前连接):

        select @@transaction_isolation;

查看全局的事务隔离级别(整个MySQL服务器采用的事务隔离级别,也是所有新连接的默认设置):

        select @@global.transaction_isolation;

设置当前会话的事务隔离级别

        set session transaction isolation level [隔离的四种级别];

设置全局的事务隔离级别

        set global transaction isolation level [隔离的四种级别];

4,事务的操作流程

        MySQL运用事务时,具体的详细流程是:

        1,根据需求,选择事务的隔离级别,MySQL默认是REPEATABLE READ(可重复读)。

        2,查看事务的提交方式,根据需求进行设置。默认情况下的提交方式是自动提交,一条单独的 SQL 语句就是一个独立的事务,直接 SQL 指令操作即可,如同平常的一般操作。如果你希望执行一系列操作作为一个整体(也就是一个事务),然后进行提交,那么就需要使用手动提交。下面的操作流程都是按照手动提交的方式进行的,自动提交没有任何流程。

        3,开启一个事务。需注意,使用指令开启一个新事务时,这隐含地使用手动提交方式,即set autocommit=0;(关闭自动提交),但不会改变全局或会话变量的实际值,也就是说使用 show variables like 'autocommit'; 查看到的提交方式仍没有变化。

(除非你显式设置)。

开启一个事务:start transaction; begin;        此时的提交方式是手动提交

        4,设置保存点。保存点可根据需求自由选择设置。在复杂的事务中,可能需要部分回滚。MySQL允许你在事务中设置保存点,然后选择性地回滚到某个保存点。至于保存点的释放也是可选择的,因为 MySQL 在事务结束后会自动释放未释放的保存点。

设置保存点:savepoint [保存点名称];

释放保存点:release savepoint [保存点名称];

例如:

        创建一个保存点save1:savepoint save1;     

        释放保存点save1:release savepoint save1;

        5,执行事务中的 SQL 操作。这里就开始进行 SQL 操作了。

        注意:4和5通常是一体的,即每次操作时,先设置保存点,然后指定 SQL 操作。

        6,回滚事务。回滚操作也是自由选择的操作。该操作是为了防止事务在处理过程中所发生的错误。回滚操作分为两类:1,回滚到事务开始的最初状态,即撤销事务中的所有操作。2,选择性地回滚到某个保存点,即回滚到某一个保存点所保存的指令。

回滚到最初状态:rollback;

回滚到保存点:rollback to [保存点名称];

例如:rollback to save2;      回滚到保存点save2

        7,提交事务。当你完成了事务中的所有操作,就可以提交对事务所做的操作了,即手动提交,结束事务。这时,事务中的所有更改都会被保存到数据库中。

提交事务:commit

        下面来以具体的样例说明:

创建一个 test 表:create table test(id int primary key,name varchar(50));

查看提交方式:show variables like 'autocommit';

开始一个事务:begin;

创建一个保存点save1:savepoint save1;

插入一条记录:insert into test values (1, '李白');

创建一个保存点save2:savepoint save2;

插入一条记录:insert into test values (2, '杜甫');

查看操作:select * from test;     数据已经存在,但没有commit,此时只是在该终端下查看

回滚到保存点save2:rollback to save2;

再次查看:select * from test;       此时没有(2,'杜甫')的记录,因为发生了回滚

回滚在最开始:rollback;             此时再次查看发现一条记录也没有了

        注意:事务的操作过程中,当操作异常时,MySQL会自动回滚。


        事务的隔离底层往往是运用相应的锁来控制。隔离级别越严格,安全性就越高,但数据库的并发性能也就越低,实际情况中往往需要在两者之间找一个平衡点。

        如果系统运行发生中断,使某个事务尚未完成而被迫中断,这时,使用 InnoDB 存储引擎的MySQL 数据库能够通过其内置的日志和恢复机制来维护数据的一致性和完整性。对于未提交的事务,它会被回滚。

        总结一下,不可重复读的重点是修改和删除,即同样的条件,读取过的数据再次读取出来时,发现值不一样了。幻读的重点在于新增行,即同样的条件,第1次和第2次读出来的记录数不一样。MySQL 默认的隔离级别是可重复读,一般情况下不要修改。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/79138.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一、OrcaSlicer源码编译

一、下载 1、OrcaSlicer 2.3.0版本的源码 git clone https://github.com/SoftFever/OrcaSlicer.git -b v2.3.0 二、编译 1、在OrcaSlicer目录运行cmd窗口,输入build_release.bat 2、如果出错了,可以多运行几次build_release.bat 3、在OrcaSlicer\b…

港口危货储存单位主要安全管理人员考试精选题目

港口危货储存单位主要安全管理人员考试精选题目 1、危险货物储存场所的电气设备应符合( )要求。 A. 防火 B. 防爆 C. 防尘 D. 防潮 答案:B 解析:港口危货储存单位存在易燃易爆等危险货物,电气设备若不防爆&…

格雷希尔用于工业气体充装站的CZ系列气罐充装转换连接器,其日常维护有哪些

格雷希尔气瓶充装连接器,长期用于压缩气体的快速充装和压缩气瓶的气密性检测,需要进行定期的维护,为每一次的充装提供更好的连接。下列建议的几点维护准则适用于格雷希尔所有充注接头,请非专业人士不要随意拆卸连接器。 格雷希尔气…

Java 多线程进阶:什么是线程安全?

在多线程编程中,“线程安全”是一个非常重要但又常被误解的概念。尤其对于刚接触多线程的人来说,不理解线程安全的本质,容易写出“偶尔出错”的代码——这类 bug 往往隐蔽且难以复现。 本文将用尽可能通俗的语言,从三个角度解释线…

MSO-Player:基于vlc的Unity直播流播放器,支持主流RTSP、RTMP、HTTP等常见格式

MSO-Player 基于libVLC的Unity视频播放解决方案 支持2D视频和360度全景视频播放的Unity插件 📑 目录 🎥 MSO-Player 📋 功能概述🚀 快速入门📚 关键组件📝 使用案例🔌 依赖项📋 注意…

navicat中导出数据表结构并在word更改为三线表(适用于navicat导不出doc)

SELECTCOLUMN_NAME 列名,COLUMN_TYPE 数据类型,DATA_TYPE 字段类型,IS_NULLABLE 是否为空,COLUMN_DEFAULT 默认值,COLUMN_COMMENT 备注 FROMINFORMATION_SCHEMA.COLUMNS WHEREtable_schema db_animal(数据库名) AND table_name activity(…

docker学习笔记6-安装wordpress

一、创建自定义网络、查看网络 docker netword create blog docker network ls 二、 启动mysql容器 启动命令: docker run -d -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD123456 \ -e MYSQL_DATABASEwordpress \ -v mysql-data:/var/lib/mysql \ -v /app/myconf:/etc…

03_Mybatis-Plus LambadaQueryWrapper 表达式爆空指针异常

&#x1f31f; 03_MyBatis-Plus LambdaQueryWrapper 爆出空指针异常的坑点分析 ❓ 场景描述 来看一段常见的 MyBatis-Plus 查询写法&#xff0c;是否存在问题&#xff1f; Page<VideoInfoVo> videoInfoVosPage videoMapper.selectPage(page, new LambdaQueryWrapper&…

WEB安全--社会工程--SET钓鱼网站

1、选择要钓鱼的网站 2、打开kali中的set 3、启动后依次选择&#xff1a; 4、输入钓鱼主机的地址&#xff08;kali&#xff09;和要伪装的网站域名&#xff1a; 5、投放钓鱼网页&#xff08;服务器域名:80&#xff09; 6、获取账号密码

Ethan独立开发产品日报 | 2025-04-29

1. mrge 代码审查的光标 mrge 是一个由人工智能驱动的代码审查平台&#xff0c;能够自动审核拉取请求&#xff08;PR&#xff09;&#xff0c;为人工审查员提供超级能力。它是像 cal.com 和 n8n 这样快速发展的团队的首选工具。 关键词&#xff1a;mrge, 代码审查, AI驱动, …

ubuntu22.04 qemu arm64 环境搭建

目录 创建 安装 Qemu 启动 # 进入qemu虚拟机后执行 qemu编译器安装 创建 qemu-img create ubuntu22.04_arm64.img 40G 安装 qemu-system-aarch64 -m 4096 -cpu cortex-a57 -smp 4 -M virt -bios QEMU_EFI.fd -nographic -drive ifnone,fileubuntu-22.04.5-live-server-a…

安全生产知识竞赛宣传口号160句

1. 安全生产是责任&#xff0c;每个人都有责任 2. 安全生产是保障&#xff0c;让我们远离危险 3. 安全生产是团结&#xff0c;共同守护每一天 4. 注重安全&#xff0c;守护明天 5. 安全生产无小事&#xff0c;关乎千家万户 6. 安全第一&#xff0c;人人有责 7. 安全生产无差别&…

Python 虚拟环境管理:venv 与 conda 的选择与配置

文章目录 前言一、虚拟环境的核心价值1.1 依赖冲突的典型场景1.2 隔离机制实现原理 二、venv 与 conda 的架构对比2.1 工具定位差异2.2 性能基准测试&#xff08;以创建环境 安装 numpy 为例&#xff09; 三、venv 的配置与最佳实践3.1 基础工作流3.2 多版本 Python 管理 四、…

【自然语言处理与大模型】如何获取特定领域的微调数据集?

在特定领域中&#xff0c;数据集通常由提出需求的一方提供。然而&#xff0c;在某些情况下&#xff0c;如果他们未能提供所需的数据&#xff0c;或者你正在独立开展一个项目&#xff0c;并且需要相应的数据来推进工作&#xff0c;这时你应该怎么办呢&#xff1f;本文提供一种思…

Map系列之ConcurrentHashMap源码分析:高并发场景下的性能密码

引言&#xff1a;当线程安全成为刚需 1.1 并发时代的Map困境 经典案例&#xff1a;电商秒杀系统超卖事故分析&#xff08;附线程堆栈截图&#xff09;传统方案缺陷&#xff1a;synchronizedMap的吞吐量陷阱&#xff08;JMH测试数据对比&#xff09;ConcurrentHashMap的定位&a…

URP - 序列图动画的实现

效果&#xff1a; 【太妃糖耶】更新了一条视频&#xff0c;快来围观&#xff01; 序列图动画的实现 首先先了解下序列图样式的纹理图片 如上图一可在Shader中使用该图片制作燃烧的火的动画&#xff0c;但是如何实现呢&#xff1f;接下来一起来看一下吧 序列图动画的实现原理大…

python中 str.strip() 是什么意思

在 Python 中&#xff0c;str.strip() 是字符串&#xff08;str&#xff09;类型的一个方法&#xff0c;用于移除字符串两端的空白字符&#xff08;默认情况下&#xff09;或指定字符&#xff0c;并返回处理后的新字符串。 语法&#xff1a; str.strip([chars])chars&#xf…

记录idea可以运行但是maven install打包却找不到问题

解决idea使⽤maven多模块install报依赖模块的包找不到的问题 如果被依赖项⽬是springboot项⽬&#xff0c;那么可以把相关的springboot的东西移除掉&#xff0c;改造成普通项⽬。如果不想改造项⽬&#xff0c;那就添加部分的配置&#xff0c;因为springboot项⽬打包的时候会⽣…

uniapp如何获取安卓原生的Intent对象

通过第三方app唤起&#xff0c;并且获取第三方app唤起时携带的参数 因为应用a唤起应用b时&#xff0c;应用b第一时间就要拿到参数token&#xff0c;所以需要将获取参数的方法写在APP.vue中的onLaunch钩子里,如果其他地方要用可以选择vuex或者采用本地缓存。 uniapp中plus.run…

《多端统一的终极答案:X5内核增强版的渲染优化全解析》

跨端应用的需求呈爆发式增长&#xff0c;无论是电商购物、社交互动&#xff0c;还是金融理财类应用&#xff0c;都期望能够在不同平台上为用户提供一致且流畅的体验。而在这一过程中&#xff0c;跨端渲染技术成为了关键瓶颈。腾讯X5内核增强版的出现&#xff0c;犹如一道曙光&a…