【数据库】mysql事务

一、事务的基本概念

1、事务的定义

事务可由一条非常简单的SQL语句组成,也可以由一组复杂的SQL语句组成。。

  • 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务
  • 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行
  • 事务用来管理 insert、update、delete 语句

2、事务的特性

事务需遵循ACID四个特性:

  • A(atomicity)原子性。原子性指整个数据库事务是不可分割的工作单位。只有使事务中所有的数据库操作都执行成功,整个事务的执行才算成功。事务中任何一个SQL语句执行失败,那么已经执行成功的SQL语句也必须撤销,数据库状态应该回滚到执行事务前的状态。

  • C(consistency),一致性。一致性指事务将数据库从一种状态转变为另一种一致的状态。在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。

  • I(isolation),隔离性。数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务的隔离性要求每个读写事务的对象与其他事务的操作对象能相互分离,即该事务提交前对其他事务都不可见,这通常使用 来实现。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)

  • D(durability) ,持久性事务一旦提交,其结果就是永久性的,即使发生宕机等故障,数据库也能将数据恢复。持久性保证的是事务系统的高可靠性,而不是高可用性。

 3、事务的类型

(1)扁平事务(Flat Transactions)

是事务类型中最简单的一种,而在实际生产环境中,这可能是使用最为频繁的事务。在扁平事务中,所有操作都处于同一层次,其由BEGIN WORK开始,由COMMIT WORK或ROLLBACK WORK结束。处于之间的操作是原子的,要么都执行,要么都回滚

(2)带有保存点的扁平事务(Flat Transactions with Savepoints)

除了支持扁平事务支持的操作外,允许在事务执行过程中回滚到同一事务中较早的一个状态(保存点),这是因为可能某些事务在执行过程中出现的错误并不会对所有的操作都无效,放弃整个事务不合乎要求,开销也太大。保存点(savepoint)用来通知系统应该记住事务当前的状态,以便以后发生错误时,事务能回到该状态。

保存点在事务内部是递增的,ROLLBACKU不影响保存点的计数,单调递增编号能保持事务执行的整个历史过程 。

当发生系统崩溃是,所有的保存点都将消失,因为其保存点是易失的,这意味着当进行恢复时,事务需要从开始处重新执行,而不能从最近的一个保存点继续执行

(3)链事务(Chained Transactions)

可视为保存点模式的一个变种。链事务的思想是:在提交一个事务时,释放不需要的数据对象,将必要的处理上下文隐式地传给下一个要开始的事务。注意,提交事务操作和开始下一个事务操作将合并为一个原子操作。这意味着下一个事务将看到上一个事务的结果,就好像在一个事务中进行的。

假设T2事务执行过程中系统崩溃导致执行失败,将会从T2的起始位置重新执行,T1事务在崩溃之前已经完成提交。 链事务回滚只限于当前事务,即只能恢复到最近一个的保存点。

 

(4)嵌套事务(Nested Transactions)

是一个层次结构框架。有一个顶层事务(top-level transaction)控制着各个层次的事务。顶层事务之下嵌套的事务被称为子事务(subtransaction),其控制每一个局部的变换。

  • 子事务既可以提交可以回滚,但是它的提交操作并不会马上生效,除非其父事务已经提交。因此,任何子事务都在顶层事务提交后才真正提交。 
  • 树中的任意一个事务的回滚会引起其他的所有子事务一同回滚,故子事务仅保留A、C、I特性,不具备D的特性
  • 只有叶子节点的事务才能访问数据库,发送消息,获取其他类型的资源。而高层的事务仅负责逻辑控制,决定何时调用相关的子事务。即使一个系统不支持嵌套事务,可以通过保存点技术来模拟嵌套事务。

 

(5)分布式事务

通常是一个在分布式环境下运行的扁平事务,因此需要根据数据所在位置访问网络中的不同节点。对于分布式事务,同样需要满足ACID特性,要么都发生,要么都失效。

假设一个用户使用ATM机进行跨行转账操作,例如老王持卡从招商银行储蓄卡转账10000元到工商银行储蓄卡中。此时可以报ATM机视为节点A,招商银行后台数据库视为节点B,工商银行后台数据库视为节点C,那么转账操作可以分解为以下步骤:

① 节点A发出转账命令

② 节点B执行储蓄卡余额减去10000

③ 节点C执行储蓄卡余额加上10000

④ 节点A通知用户操作成功或者通知用户操作失败。

这个场景需要使用分布式事务,因为节点A不能通过调用一个数据库完成该任务,其需要访问网络中两个节点的数据库,而每个结点的数据库执行的事务操作又都是扁平的。

【小结】

对于MySQL的InnoDB存储引擎来说,它支持扁平事务、带有保存点的扁平事务、链事务、分布式事务。对于嵌套事务,MySQL数据库并不是原生的,因此对于有并行事务需求的用户来说MySQL就无能为力了,但是用户可以通过带有保存点的事务来模拟串行的嵌套事务。


二、mysql事务ACID特性的实现原理

1、原子性实现原理

实现原子性的关键,是当事务回滚时能够撤销所有已经成功执行的sql语句InnoDB实现回滚 靠的是 undo log,当事务对数据库进行修改时,InnoDB会生成对应的undo log。如果事务执行失败或调用了rollback,导致事务需要回滚,便可以利用undo log中的信息将数据回滚到修改之前的样子。

undo log属于逻辑日志,它记录的是sql执行相关的信息当发生回滚时,InnoDB会根据undo log的内容做与之前相反的工作。对于insert,回滚时会执行delete。对于delete,回滚时会执行insert。对于update,回滚时则会执行相反的update,把数据改回去。

2、持久性实现原理 

InnoDB作为MySQL的存储引擎,数据是存放在磁盘中的,但如果每次读写数据都需要磁盘IO,效率会很低。为此,InnoDB提供了缓存(Buffer Pool),Buffer Pool中包含了磁盘中部分数据页的映射,作为访问数据库的缓冲。当从数据库读取数据时,会首先从Buffer Pool中读取,如果Buffer Pool中没有,则从磁盘读取后放入Buffer Pool。当向数据库写入数据时,会首先写入Buffer Pool,Buffer Pool中修改的数据会定期刷新到磁盘中(这一过程称为刷脏)。

Buffer Pool的使用大大提高了读写数据的效率,但是也带了新的问题:如果MySQL宕机,而此时Buffer Pool中修改的数据还没有刷新到磁盘,就会导致数据的丢失,事务的持久性无法保证。

于是,redo log被引入来解决这个问题。当数据修改时,除了修改Buffer Pool中的数据,还会在redo log记录这次操作。当事务提交时,会调用fsync接口对redo log进行刷盘。如果MySQL宕机,重启时可以读取redo log中的数据,对数据库进行恢复。redo log采用的是WAL(Write-ahead logging,预写式日志),所有修改先写入redo log日志,再更新到Buffer Pool,保证了数据不会因MySQL宕机而丢失,从而满足了持久性要求。

既然redo log也需要在事务提交时将日志写入磁盘,为什么它比直接将Buffer Pool中修改的数据写入磁盘(即刷脏)要快呢?主要有以下两方面的原因:

  • 刷脏是随机IO,因为每次修改的数据位置随机,但写redo log是追加操作,属于顺序IO。

  • 刷脏是以数据页(Page)为单位的,MySQL默认页大小是16KB,一个Page上一个小修改都要整页写入。而redo log中只包含真正需要写入的部分,无效IO大大减少。

3、隔离性实现原理

隔离性追求的是并发情形下事务之间互不干扰。简单起见,我们主要考虑最简单的读操作和写操作(加锁读等特殊读操作会特殊说明),那么隔离性的探讨,主要可以分为两个方面。

第一方面,(一个事务)写操作对(另一个事务)写操作的影响:锁机制保证隔离性。

隔离性要求同一时刻只能有一个事务对数据进行写操作,InnoDB通过锁机制来保证这一点。锁机制的基本原理可以概括为:事务在修改数据之前,需要先获得相应的锁。获得锁之后,事务便可以修改数据。该事务操作期间,这部分数据是锁定的,其他事务如果需要修改数据,需要等待当前事务提交或回滚后释放锁。

按照粒度,锁可以分为表锁行锁以及其他位于二者之间的锁(间隙锁)。表锁操作数据时会锁定整张表并发性能较差行锁只锁定需要操作的数据并发性能好。但是由于加锁本身需要消耗资源,因此在锁定数据较多情况下使用表锁可以节省大量资源。MySQL中不同的存储引擎支持的锁是不一样的,例如MyIsam只支持表锁,而InnoDB同时支持表锁和行锁,且出于性能考虑,绝大多数情况下使用的都是行锁。

第二方面,(一个事务)写操作对(另一个事务)读操作的影响:MVCC保证隔离性。

InnoDB默认的隔离级别是RR(REPEATABLE READ),RR解决脏读、不可重复读、幻读等问题,使用的是MVCC。MVCC全称Multi-Version Concurrency Control,即多版本的并发控制协议。它最大的优点是读不加锁,因此读写不冲突,并发性能好。InnoDB实现MVCC,多个版本的数据可以共存,主要基于以下技术及数据结构:

  1. 隐藏列:InnoDB中每行数据都有隐藏列,隐藏列中包含了本行数据的事务id、指向undo log的指针等。

  2. 基于undo log的版本链:每行数据的隐藏列中包含了指向undo log的指针,而每条undo log也会指向更早版本的undo log,从而形成一条版本链。

  3. ReadView:通过隐藏列和版本链,MySQL可以将数据恢复到指定版本。但是具体要恢复到哪个版本,则需要根据ReadView来确定。所谓ReadView,是指事务(记做事务A)在某一时刻给整个事务系统(trx_sys)打快照,之后再进行读操作时,会将读取到的数据中的事务id与trx_sys快照比较,从而判断数据对该ReadView是否可见,即对事务A是否可见。

4、一致性实现原理

一致性是事务追求的最终目标。前面提到的原子性、持久性和隔离性,都是为了保证数据库状态的一致性。此外,除了数据库层面的保障,一致性的实现也需要应用层面进行保障。实现一致性的措施包括:

  • 保证原子性、持久性和隔离性,如果这些特性无法保证,事务的一致性也无法保证。

  • 数据库本身提供保障,例如不允许向整形列插入字符串值、字符串长度不能超过列的限制等。

  • 应用层面进行保障,例如如果转账操作只扣除转账者的余额,而没有增加接收者的余额,无论数据库实现的多么完美,也无法保证状态的一致。


 三、MySQL数据库隔离级别

1、并发事务问题

(1)脏读

一个事务B读取到另一个事务A还没有提交的数据,这种现象是脏读。

(2)不可重复读

事务A中先后两次读取同一个数据,两次读取的结果不一样,这种现象称为不可重复读。

脏读与不可重复读的区别

前者读到的是其他事务未提交的数据,后者读到的是其他事务已提交的数据

 (3)幻读

一个事务按照条件查询数据时,没有对应数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了“幻影”。

【不可重复读与幻读的区别】

前者是原数据变了,后者是数据行变了(插入了新数据)。

2、事务隔离级别

SQL 标准定义了四种隔离级别,这四种隔离级别分别是

  • 读未提交READ UNCOMMITTED);

  • 读提交 READ COMMITTED);

  • 可重复读 REPEATABLE READ);

  • 串行化 SERIALIZABLE

事务隔离是为了解决脏读、不可重复读、幻读问题,下表展示了 4 种隔离级别对这三个问题的解决程度:

上述4种隔离级别MySQL都支持,并且InnoDB存储引擎默认的支持隔离级别是REPEATABLE READ,但是与标准SQL不同的是,InnoDB存储引擎在REPEATABLE READ事务隔离级别下,使用Next-Key Lock的锁算法,因此避免了幻读的产生。所以,InnoDB存储引擎在默认的事务隔离级别下已经能完全保证事务的隔离性要求,即达到SQL标准的SERIALIZABLE隔离级别

3、事务隔离级别的实现机制 

(1)READ UNCOMMITTED & READ COMMITTED

通过Record Lock算法实现了行锁,但READ UNCOMMITTED允许读取未提交数据,所以存在脏读问题。而READ COMMITTED允许读取提交数据,所以不存在脏读问题,但存在不可重复读问题。

(2)REPEATABLE READ

使用Next-Key Lock算法实现了行锁,并且不允许读取已提交的数据,所以解决了不可重复读的问题。另外,该算法包含了间隙锁,会锁定一个范围,因此也解决了幻读的问题

(3)SERIALIZABLE

对每个SELECT语句后自动加上LOCK IN SHARE MODE,即为每个读取操作加一个共享锁。因此在这个事务隔离级别下,读占用了锁,对一致性的非锁定读不再予以支持。


 四、事务控制语句

BEGIN 或 START TRANSACTION -- 用于显式开启一个事务:

BEGIN; -- 或者使用 START TRANSACTION;

COMMIT -- 用于提交事务,将所有的修改永久保存到数据库:

COMMIT;

ROLLBACK -- 用于回滚事务,回滚会结束用户的事务,并撤销正在进行的所有未提交的修改;:

ROLLBACK;

SAVEPOINT -- 用于在事务中设置保存点,以便稍后能够回滚到该点:

SAVEPOINT savepoint_name;

ROLLBACK TO SAVEPOINT -- 用于回滚到之前设置的保存点:

ROLLBACK TO SAVEPOINT savepoint_name;

 RELEASE SAVEPOINT --用于删除一个事务的保存点,当没有保存点时,执行该语句会抛异常。

 RELEASE SAVEPOINT savepoint_name

SET TRANSACTION 用来设置事务的隔离级别。InnoDB 存储引擎提供事务的隔离级别有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 和 SERIALIZABLE。

--查看事务隔离级别
select @@TRANSACTION_ISOLATION;

--设置事务隔离级别
SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL [READ UNCOMMITTED|READ COMMITTED|REPEATABLE READ |SERIALIZABLE]

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

海外代理IP在游戏中有什么作用?

随着科技的飞速发展,手机和电脑等电子产品已成为互联网连接万物的重要工具,深度融入我们的日常生活,我们借助互联网完成工作、休闲和购物等任务,以求提升生活质量。 不仅如此,网络游戏也是人们心中最爱,它…

2024.1.8每日一题

LeetCode 回旋镖的数量 447. 回旋镖的数量 - 力扣(LeetCode) 题目描述 给定平面上 n 对 互不相同 的点 points ,其中 points[i] [xi, yi] 。回旋镖 是由点 (i, j, k) 表示的元组 ,其中 i 和 j 之间的距离和 i 和 k 之间的欧式…

Prometheus Blackbox_exporter笔记

一、安装Promtheus 在 Prometheus 官网 Download | Prometheus 获取适用于 Linux 的 Prometheus 安 装包,这里我选择最新的 2.46.0 版本,我是 Linux 系统,选择下载 prometheus-2.46.0.linux-amd64.tar.gz 下载安装包: wget htt…

UI自动化测试神器:RunnerGo

UI自动化测试已经成为现代软件开发过程中不可或缺的一部分。它能够提供诸多优势,包括提高测试效率、减少人力成本、提升软件质量等。同时,可视化工具为UI自动化测试带来了更多便利和灵活性。然而,可视化工具也存在一些潜在的劣势。本文将探讨…

读元宇宙改变一切笔记01_起源

1. 元宇宙是我们下一个生存之地 1.1. 1968年,只有不到10%的美国家庭拥有彩色电视,但当年票房排名第二位的电影《2001:太空漫游》(2001: A Space Odyssey)设想了这样的未来 1.1.1. 斯坦利库布里克(Stanley Kubrick) …

二 数据查询

1、实验目的 理解SQL成熟设计基本规范,熟练运用SQL语言实现数据基本查询,包括但表查询、分组统计查询和连接查询。 2、实验内容及要求 针对数据库设计各种单表查询SQL语句、分组统计查询语句;设计单个表针对自身的连接查询,设计…

lc 140. 单词拆分 II

回溯算法查询匹配单词 class Solution { public:unordered_map<string, int> word_map;void mapping(vector<string>& wordDict){for(auto &a : wordDict)word_map[a];}vector<string> ret;// s: 原始字符串// tmp: 已查询到的单词// …

【Flutter 开发实战】Dart 基础篇:最基本的语法内容

在深入了解 Dart 这门编程语言之前&#xff0c;我们需要了解一些关于 Dart 的最基本的知识&#xff0c;像是常量、变量、函数等等&#xff0c;这样才能够让我们的开发效率更上一层楼。在本节&#xff0c;我们将探讨一些基础语法&#xff0c;包括入口方法 main、变量、常量以及命…

光伏组件QUV紫外加速老化试验箱

一、产品特点 QUV紫外加速老化试验箱能模拟阳光中 UV340波段光谱的荧光紫外灯&#xff0c;并结合控温、供湿等装置来模拟对材料造成变色、亮度、强度下降&#xff1b;开裂、剥落、粉化、氧化等损害的阳光&#xff0c;以及高温、高湿、凝露、黑暗周期等因素&#xff0c;同时通过…

Linux文件系统与日志分析管理

目录 一、文件系统 1. inode表 2. 查看inode号 3. 文件目录 4. 三种时间戳 5. 删除文件空间不释放 6. 文件恢复extundelete 7. xfs类型备份和恢复 二、日志分析 1. 日志的种类 2. 内核和公共日志 3. 用户日志 3.1 查询当前登录的用户情况 3.2 查询用户登录的历史记…

Linux-添加虚拟内存,不添加硬盘方式操作

在linux中&#xff0c;当物理内存mem不足时&#xff0c;就会使用虚拟内存(swap分区) 例如增加2G虚拟内存&#xff0c;操作如下: 1.查看内存大小 [rootlocalhost ~]# free -m 2.创建要作为swap分区的文件:增加1GB大小的交换分区&#xff0c;则命令写法如下&#xff0c;其中的cou…

免费的开源低代码平台推荐

1.JNPF 最后&#xff0c;推荐一个近期用的不错的低代码。 应用地址&#xff1a;https://www.jnpfsoft.com?csdn 开发语言&#xff1a;Java/.net 这是一个基于 Java Boot/.Net Core 构建的简单、跨平台快速开发框架。前后端封装了上千个常用类&#xff0c;方便扩展&#xf…

Redis分布式锁(二)基于Redis的分布式锁

一、redis锁 1、思路 利用set nx ex获取锁&#xff0c;并设置过期时间&#xff0c;保存线程标识释放锁时先判断线程标识是否与自己一致&#xff0c;一致则删除 2、特性 利用set nx满足互斥性利用set ex保证故障时锁依然能释放&#xff0c;避免死锁&#xff0c;提高安全性利…

普冉32位单片机 PY32C642,M0+内核,1.7 V ~ 5.5 V宽工作电压

PY32C642 单片机采用高性能的 32 位 ARM Cortex-M0内核&#xff0c;宽电压工作范围。嵌入 24Kbytes Flash 和 3 Kbytes SRAM 存储器&#xff0c;最高工作频率 24 MHz。包含多种不同封装类型产品。工作温度范围为-40C ~ 85C&#xff0c;工作电压范围 1.7 V ~ 5.5 V。1 路 12 位A…

影响代理IP稳定性的因素有哪些?

代理IP作为一种网络服务&#xff0c;在生活中扮演着各种各样的角色。它们可以用于保护隐私、突破访问限制、提高网络安全性等。代理IP的稳定性受到多种因素的影响&#xff0c;下面和大家探讨一下影响代理IP稳定性的因素。 1、网络环境&#xff1a;代理IP所处的网络环境对它的稳…

【一】达梦数据库安装和使用-Windows

达梦数据库安装和使用-Windows 简介&#xff1a; 新能源行业关系到国计民生&#xff0c;保障能源安全的意识不容懈怠&#xff0c;近些年各行各业都在推进数字化进程&#xff0c;能源行业在国家3060双碳目标提出之后更是进行的如火如荼&#xff0c;能源互联网方面在数字化的同时…

【设计模式】访问者模式

一起学习设计模式 目录 前言 一、概述 二、结构 三、案例实现 四、优缺点 五、使用场景 六、扩展 总结 前言 【设计模式】访问者模式——行为型模式。 一、概述 定义&#xff1a; 封装一些作用于某种数据结构中的各元素的操作&#xff0c;它可以在不改变这个数据结构…

URL编码揭秘:为什么要进行URL编码?

URL&#xff08;Uniform Resource Locator&#xff0c;统一资源定位符&#xff09;是互联网上资源地址的唯一标识符。在网络请求和数据传输过程中&#xff0c;URL编码起着至关重要的作用。 URL编码解码 | 一个覆盖广泛主题工具的高效在线平台(amd794.com) https://amd794.com…

基于JAVA的中小学教师课程排课系统 开源项目

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 角色管理模块2.2 课程档案模块2.3 排课位置模块2.4 排课申请模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 角色表3.2.2 课程表3.2.3 排课位置表3.2.4 排课申请表 四、系统展示五、核心代码5.1 查询课程5.2 新增课…

AI新纪元:AI原生企业崛起

导读&#xff1a;当前&#xff0c;以大模型为代表的人工智能技术已成为驱动经济社会发展、提升国家竞争力的关键要素&#xff0c;并以前所未有的速度重塑产业的新格局、驱动经济发展的新方向&#xff0c;并展现出强大的赋能效应&#xff0c;给千行百业带来“质量与效率”的变革…