InnoDB事务

news2024/10/7 12:22:34

1. 支持的事务

扁平事务:所有操作都处于同一层次

带保持点的扁平事务:事务能够回到保持点的状态。

链事务:系统崩溃时,所有保存点都将消失。

嵌套事务:具有层次结构(树)。任意一个事务回滚会引起它的所有子事务一同回滚。并不原生支持。

分布式事务

2. 事务的实现

事务的隔离性由锁实现
redo log 用来保证事务持久性
undo log 用来保证一致性、原子性

redo 是恢复提交事务修改的页操作,undo 回滚行记录到某个特定版本
redo 通常记录的是页的物理修改操作; undo 是逻辑日志,根据每行记录进行记录

2.1 redo

功能:保证事务的持久性。基本是顺序写。由存储引擎生成。

包含两部分:redo log缓存(内存中), redo log文件

(1)事务提交时,必须先将该事务的所有log写入到redo log文件中,才算完成COMMIT操作。
为了确保重做日志写入磁盘,需要调用一次fsync操作

innodb_flush_log_at_trx_commit控制redo log刷新到磁盘的操作。
0表示,事务提交时不进行写入日志文件的操作。(写入日志文件由master thread完成)
1表示,写入日志文件,并调用fsync。(默认设置)
2表示,写入日志文件,不调用fsync(在文件系统缓存中)

(2)binlog 日志,用来进行PONIT-IN-TIME(PIT)的恢复及主从复制环境的建立。
由MySQL的上层产生,逻辑日志,记录的是对应的SQL语句。只在事务提交完成后进行一次写入。

(3)以 block 方式保存,大小为512字节
日志块头,12字节
日志内容,492字节
日志块尾,8字节
图7-7
(4)log group 由多个redo log文件组成,每个日志文件的大小相同

将内存中的log block刷新到磁盘的时机:
事务提交时
当log buffer中有一半的内存空间已经被使用时
log checkpoint 时

(5)以append的方式写入redo log file的最后部分,当写满时,接着写入下一个redo log file
每个redo log file的前2KB部分不保存log block的信息。

log group在的第一个 redo log file保存了log file header等信息,在写入后续日志时可能需要更新该部分信息,因此对redo log file的写入并不是完全顺序的。
图7-9
(6)redo log格式
图7-10
redo log type 为重做日志的类型
space 为表空间ID
page_no:页的偏移量

图7-11
(7)LSN,占用8字节
其代表的含义为:
重做日志写入总量
checkpoint的位置
页的版本

每个页中FIL_PAGE_LSN表示该页最后刷新时的LSN。

2.2 undo

此处可参考: link

帮助事务回滚和MVCC的功能。需要随机读写

undo log存放在** undo 段**中

undo是逻辑日志,例如,对每个INSERT,会进行一个DELETE。

undo会产生redo log

(1)InnoDB存储引擎有 rollback segment,每个回滚段有1024个undo log segment,在undo log segment中进行undo页的申请。

在undo log segment分配页并写入undo log的过程,同样需要写入redo log。

(2)具体组织方式:Undo Tablespace

要求:每个写事务开始写操作之前都需要持有一个Undo Segment

Undo Tablespace 中最多可有 128 个 Rollback Segment Header,并且有 Rollback Segment Arrary Header,类似指针数组,指向各个Rollback Segment Header;

每个 Rollback Segment Header 中包含了 History List,还有 1024 个 Slot,指向每个 Undo Segment。

每个 Undo Segment 会持有至少一个 Undo Page ,并且该段下的第一个 Undo Page 会有 Undo Page Header 和 Undo Segment Header,剩余的空间都是用来存放Undo Log的

(3)当事务提交时
将undo log放入链表中,以供之后的purge操作
判断undo log所在的页能否重用,若可以分配给下一个事务使用。

事务提交后并不能马上删除undo log及其所在的页,这是因为可能会被MVCC使用。
事务提交时,判断undo页的使用空间是否小于3/4,若是则表示该undo页可以被重用。

(4)undo log 格式
insert undo log 在事务提交后直接删除。

update undo log 可能需要提供MVCC机制,不能在事务提交时删除。
图7-14
上图中的n_unique_index是记录的主键部分(变长部分,主键可以有多列),通过记录的主键可以找到该行记录。

update vector中记录的就是当前这个Record版本相对于其之后的一次修改的Delta信息

DATA_TRX_ID是历史版本记录的事务IDtrx_id,而非当前修改事务的。

(5)隐藏列中的roll_pointer,就是指向undo log中该行旧版本的记录

这也是为什么update undo log中trx_idroll_ptr存在的目的,这些记录可以组成链表。

对 MVCC 读语句会有 Read View,其记录了当前活跃事务ID列表及下一个开始事务的ID,因此可将事务分为:已经提交事务(min_trx_id,当前活跃事务列表中的最小值),正活跃事务列表(m_ids),未开始事务(max_trx_id)。

通过行记录的trx_id来判断对creator_trx_id(创建Read View的事务ID)是否可见。可分为三种情况:

  1. trx_id < min_trx_id 或者 trx_id 不在 m_ids 中,说明创建这个版本的记录的事务已提交,对当前事务可见。
  2. trx_id > max_trx_id,说明是在创建 Read View 之后才开启的事务,不可见。
  3. trx_id 在 m_ids 中,说明处于创建该版本的事务活跃状态未提交,不可见。

这里之所以还需要考虑是否在 m_ids 内,是因为事务提交并非按顺序进行,事务ID的分配是自增长的。即当前活跃事务可能为T2,T4,T5,此时说明比T2小的已经提交了,T3也提交了,因此要进行这种判断。

(6)ROLLBACK时的操作,从后向前依次读取Undo Record

(7)Undo log 的删除

事务结束时,会分配一个trx_no,是自增长的,维护了事务的提交顺序。

在创建Read View时,会通过头插法插入一个全局链表时,事务结束时,会从链表中进行删除。

因此该链表的尾部就是最老的视图,其记录的trx_nom_low_limit_no

若某个事务的trx_no < m_low_limit_no,则表明该事务在 当前所有活跃事务创建Read View 之前就已经提交,那么就可以删除该事务的Undo log。

注意:此处有个不太直观的地方,要区分好 Undo Log 的trx_id 对应的 trx_no 及 产生该 Undo Log 的事务的 trx_no

例如:假设有个空表,事务ID为45的向其中插入2条数据,产生的Insert Undo Log在该事务提交后就被删除了,其trx_no假设为1。
trx_id,a,value
45,1,1
45,2,1
事务ID为46的更改上述数据,
trx_id,a,value —————— Undo Log 1
46,1,2 ————————> 45, 1, 1
45,2,1
需要注意的是,这个 Undo Log 1 是放在事务ID为 46 的 Update Undo Log 中,其正常提交后,trx_no为2。
trx_id,a,value —————— Undo Log 2 —————— Undo Log 1
47,1,3 ————————> 46,1,2 ————————> 45,1,1
Undo Log 2是在事务ID为 47 的 Update Undo Log,其正常提交后,trx_no为3。
如果开启新的写事务的话,其看到的最大的 trx_no 为 3 ,而trx_no为2的事务产生的Undo Log可以被删除,从上也可知删除Undo Log 1不会产生影响。

因此,通过上述删除策略,表中的记录要么是只有聚集索引Index中的版本,要么还有至少一个Undo历史版本,所有的读事务都一定能被Index中的版本或者历史版本满足。

2.3 purge

purge用于最终完成delete和update操作

若该行记录已经不被其他任何事务引用,那么就可以进行真正的delete操作。
图7-17
(1)事务提交时,会将 Undo log header 以头插法的方式插入到 History List 中。

(2)先从History List中找 undo log,再从undo page中找undo log的设计避免了大量的随机读取操作。

2.4 group commit

将多个事务的缓存中的redo log通过一次fsync刷新到磁盘中

3. 事务

3.1 事务控制

SAVEPOINT identifier;创建保存点
ROLLBACK TO SAVEPOINT identifier;回滚到一个不存在的保存点时,会抛出异常

因为某条语句失败抛出异常时,不会自动回滚,需要用户决定提交或回滚。

3.2 隐式提交的SQL语句

ALTER TABLE、CREATE TABLE/INDEX、DROP TABLE/INDEX、TRUNCATE TABLE等,执行完这些语句后,会有一个隐式的COMMIT操作,代表这些语句不能被回滚。

3.3 事务操作统计

com_commitcom_rollback会统计 显式提交或回滚 的事务数量

3.4 事务隔离级别

在SERIALIABLE级别,InnoDB会对每个SELECT语句自动加上LOCK IN SHARE MODE;

在READ COMMITTED级别下,除了唯一性或外键约束检查需要gap lock,其余都不会使用gap lock。

3.5 分布式事务

在使用分布式事务时,InnoDB 必须设置隔离级别为 SERIALIABLE

XA事务由一个或多个资源管理器、一个事务管理器以及一个应用程序组成。

3.6 好的事务习惯

最好把事务的START TRANSACTION、COMMIT、ROLLBACK操作交给程序端来完成,而不是在存储过程中完成。

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

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

相关文章

c语言进制的转换二进制转换10进制

c语言进制的转换之二进制转换10进制 c语言的进制的转换 c语言进制的转换之二进制转换10进制一、二进制转换10进制的方法二、10进制程序打印 一、二进制转换10进制的方法 二进制&#xff1a; 二进制逢二进一&#xff0c;所有的数组是0、1组成 十进制转二进制&#xff1a; 除二反…

AD20~PCB的板层设计和布线

1、打开51单片机最小系统的工程文件。 2、完成原理图后续工作&#xff1a;打开原理图文件&#xff0c;双击元件“CH340X”窗口右边弹出元件内部属性设置界面&#xff0c;在窗口下方点击“Footprint ->Add…”按钮进入添加元件类型界面&#xff0c;进入元件封装选择界面&…

2023年行云绽放傲冠股份厨艺比拼团建活动圆满结束

十月金秋&#xff0c;阳光灿烂&#xff0c;碧空如洗。 为了促进员工之间更好的交流&#xff0c;激发员工阳光向上的心态&#xff0c;充满活力&#xff0c;拥抱自然&#xff0c;深圳市行云绽放科技有限公司及深圳市傲冠软件股份有限公司于2023年10月13日组织深圳总部员工自驾出…

接口自动化测试工具大全

在互联网时代&#xff0c;服务端测试已经成为一个重要的产品保障手段&#xff0c;各对此公司实施的方法和技术也不同&#xff0c;本文我们就来讨论一下。 互联网服务端接口自动化是各个公司都需要一部分业务&#xff0c;如何快速高效地完成接口测试呢&#xff1f; 以帮助大家实…

Linux基础命令1——Linux的命令格式与命令分类

目录 Linux命令格式 Linux命令分类 如何判断命令的类型——Type命令 内置命令 外部命令 alias命令 命令的执行效率与过程 Linux命令格式 命令格式 完整的命令格式分为三部分&#xff1a;命令、参数、对象 其中命令与参数、参数与参数、参数与对象之间最少要有一个空格做…

变分贝叶斯深度学习综述

**©PaperWeekly 原创 作者 |**薛博阳 **单位 |**香港中文大学 **研究方向 |**语言模型 引言 近年来&#xff0c;贝叶斯深度学习&#xff08;Bayesian Deep Learn-ing&#xff09;在诸多领域得到广泛关注应用&#xff0c;效果显著。本文将针对贝叶斯深度学习框架进行系…

​如何使用ArcGIS Pro制作一张地形图

01数据来源 本教程所使用的数据是从水经微图中下载的DEM数据&#xff0c;除了DEM数据&#xff0c;常见的GIS数据都可以从水经微图中下载&#xff0c;你可以通过关注“水经注GIS”&#xff0c;然后在后台回复“微图”即可获取软件下载地址&#xff0c;当然也可以直接在水经注…

TensorFlow2从磁盘读取图片数据集的示例(tf.data.Dataset.list_files)

import os import warnings warnings.filterwarnings("ignore") import tensorflow as tf from tensorflow.keras.optimizers import Adam from tensorflow.keras.applications.resnet import ResNet50 from pathlib import Path import numpy as np#数据所在文件夹 …

AI爆文变现脚本:0基础小白的保姆级操作教程-更新迭代

脚本作用&#xff1a;这个脚本主要是辅助训练营的同学使用的&#xff0c;脚本可以增加发文的效率。 脚本现在已经更新了9个版本了。目的是为了更方便大家操作使用。 AI爆文流量主(广告)变现项目的实际操作教程&#xff0c;我之前分享过了&#xff0c;大家感兴趣的可以再去看看…

灰色和测试环境打包串台

事情是这样的&#xff1a; 最近开发总说jenkins灰色环境打包总是到成测试环境的&#xff0c;测试环境总是走到了线上了。我们排查了也很久最终发现原来是这个问题导致的。如下&#xff1a; 修改如下&#xff1a; 问题解决

Tomcat+nginx负载均衡和动静分离

Nginx实现负载均衡和动静分离的原理 Nginx实现负载均衡是通过反向代理实现Nginx服务器作为前端&#xff0c;Tomcat服务器作为后端&#xff0c;web页面请求由Nginx服务来进行转发。 但是不是把所有的web请求转发&#xff0c;而是将静态页面请求Ncinx服务器自己来处理&#xff0c…

当年很流行,现在已经淘汰的前端技术有哪些?

近几年&#xff0c;前端技术真可谓是飞速发展&#xff0c;不断有新的技术涌现&#xff0c;爆火的前端框架 Astro&#xff0c;前端运行时 Bun&#xff0c;构建工具 Vite 等都给前端提供了强大动力。当然&#xff0c;也有很多前端技术随着技术的发展不再需要使用&#xff0c;有了…

【数据结构】线性表(十一)队列:双端队列及其基本操作(初始化、判空、判满、头部入队、尾部入队、头部出队、尾部出队、存取队首队尾元素)

文章目录 一、队列1. 定义2. 基本操作 二、顺序队列三、链式队列双端队列0. 头文件1. 队列结构体2. 初始化3. 判断队列是否为空4. 判断队列是否已满5. 头部入队6. 尾部入队7. 头部出队8. 尾部出队9. 存取队列头部的元素10. 存取队列尾部的元素11. 释放队列内存12. 主函数13. 代…

每日一题 2678. 老人的数目(简单)

简单题&#xff0c;不多说 class Solution:def countSeniors(self, details: List[str]) -> int:ans 0for l in details:if int(l[11:13]) > 60:ans 1return ans

CSS设置超出范围滚动条和滚动条样式

CSS设置超出范围滚动条和滚动条样式 效果展示 当块级内容区域超出块级元素范围的时候&#xff0c;就会以滚动条的形式展示&#xff0c;你可以滚动里面的内容&#xff0c;里面的内容不会超出块级区域范围。 未设置超出隐藏&#xff0c;显示滚动条 超出隐藏&#xff0c;显示滚动…

APP软件外包开发设计原则

设计一个成功的APP需要遵循一些关键的设计原则&#xff0c;以确保用户体验良好、功能明晰、吸引力和易用性。以下是一些重要的APP设计原则&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 用户为中心&…

Ubuntu系统中安装libcurl库用来做爬虫

在Ubuntu系统上运行爬虫&#xff0c;可以使用libcurl的方式简单部署libcurl爬虫管理平台。在libcurl库中&#xff0c;可以使用普通任务和定时任务来运行爬虫。同时&#xff0c;还可以添加依赖包和配置消息通知钉钉机器人等功能。如果需要使用Python-bs4库&#xff0c;可以通过系…

从GitHub火到头条!这份万众期待的阿里内部JAVA面试手册,开源了

前言&#xff1a; 现在的互联网开发岗招聘&#xff0c;程序员面试背八股文已经成为了不可逆转的形式&#xff0c;其中一个Java岗几百人在投简历也已经成为了常态&#xff01;更何况一份面试题动辄七八百道&#xff0c;你吃透了&#xff0c;技术只要不是很差&#xff0c;面试怎…

开发中常用的版本管理工具有哪些?

一、是什么 版本控制&#xff08;Version control&#xff09;&#xff0c;是维护工程蓝图的标准作法&#xff0c;能追踪工程蓝图从诞生一直到定案的过程。此外&#xff0c;版本控制也是一种软件工程技巧&#xff0c;借此能在软件开发的过程中&#xff0c;确保由不同人所编辑的…

网站页脚展示备案号并在新标签页中打开超链接

备案时&#xff0c;我们就注意到&#xff0c;备案成功后需要在网站首页底部展示“备案号”&#xff0c;并将备案号链接至https://beian.miit.gov.cn。 这里我使用了WrodPress中的主题&#xff0c;主题自定义中有提供对页脚文本的编辑&#xff0c;支持用css标签定义样式。若是自…