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

【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 默认的隔离级别是可重复读,一般情况下不要修改。

相关文章:

  • 评估个股相比大盘强弱程度的方法
  • 突发-2小时前DeepSeek发布了新模型-不是R2
  • 综合案例建模(1)
  • winserver2022如何安装AMD显卡(核显)驱动和面板(无需修改文件,设备管理器手动安装即可)
  • 如何用AI生成假期旅行照?
  • 巧用虚拟现实技术,解锁模拟训练高效密码
  • CCM/TCM在STM32中的含义和用途
  • Nginx功能全解析:你的高性能Web服务器解决方案
  • # 基于 Python 和 jieba 的中文文本自动摘要工具
  • 无刷马达驱动芯片算法逐步革新着风扇灯行业--其利天下
  • Vue 3 单文件组件中 VCA 语法糖及核心特性详解
  • DAPO:对GRPO的几点改进
  • C#学习笔记 项目引用添加异常
  • SPSS PCA+判别分析
  • 【uom】 2 quantity! 宏解析(quantity.rs)
  • 冠军之选,智启未来——解码威码逊的品牌传奇与冠军代言故事
  • Flowith:解放思维的AI画布让创意与效率如泉涌
  • 《解锁LibTorch:开启C++深度学习新征程》
  • 数学:拉马努金如何想出计算圆周率的公式?
  • 北极星 新美团核销接口对接
  • 网警查处编造传播“登顶泰山最高可得3万奖金”网络谣言者
  • 全国人大常委会关于授权国务院在中国(新疆)自由贸易试验区暂时调整适用《中华人民共和国种子法》有关规定的决定
  • 小核酸药物企业瑞博生物递表港交所,去年亏损2.81亿元
  • 原国家有色金属工业局副局长黄春萼逝世,享年86岁
  • 云南铁路:打造“铁路+金融+产业”融合发展生态
  • 深入贯彻中央八项规定精神学习教育中央指导组培训会议召开