Mysql 事务优化

news2024/9/25 17:21:34

事务的ACID特性:

  • 原子性(Atomicity):当前事务的操作要么同时成功,要么同时失败。原子性由undo log日志来保证

  • 一致性(Consistency):使用事务的最终目的,由业务代码正确逻辑保证

  • 隔离性(lsolation):在事务并发执行时,他们内部的操作不能互相干扰

  • 持久性(Durability) :一旦提交了事务,它对数据库的改变就应该是永久性的。持久性由redo log日志来保证

在 mysql 的 InnerDB 中, 定义了四中隔离级别, 级别越高事务隔离性越好, 性能越低, 而隔离性是由Mysql的各种锁一级MVCC实现的;

  • read uncoummit (读未提交): 脏读
    B事务读到A事务还未提交或回滚的数据
  • *read commit (读已提交): 不可重复读
    只能读到已提交的事务, A未提交前=500, B读到500, A修改为800, B设置+300也等于800
  • *repeatable read (可重复读): 幻读 默认事务
    第一次执行sql时, 进行快照保存, 读快照中的内容
  • serializable (串行) 没问题(性能底下)
    A执行事务时, B也执行事务, A未提交前,B的sql进行阻塞, A提交或回滚后B进行执行

undo 回滚日志

CopyOnWrite机制, 复制快照修改, 然后快照替换

每个更新或者插入操作都会记录日志, 并且每个都有一个记录id, 整个事务会记录一条日志链.
在这里插入图片描述

事务的可见性

在可重复赌隔离级别, 当事务开启, 执行任何查询sql时会生成当前事务的一致性视图Read-view, 该视图在事务结束之前都不会变化,(如果是读已提交隔离级别在每次执行查询sql时都会重新生成), 这个视图是由执行查询时所有未提交事务id数组(数组中最小id为min_id)和已创建最大事务id(Max_id)组成, 事务里的任何sql查询结果需要从对应的版本链中最新数据开始逐条跟read-view进行对比得到最终的快照结果.

版本链对比规则:

  1. 如果row的trx_id落在绿色部分(trx_id<min_id), 表示这个版本是已提交的事务生成的, 是可见的
  2. 如果row的trx_id落在红色部分(trx_id>max_id), 表示这个版本是未来启动的事务生成的, 是不可见的
  3. 如果row的trx_id落在黄色部分(min_id<=trx_id<=max_id),包括两种情况
    a: 若row的trx_id在视图数组中, 表示这个版本是由未提交的事务生成, 不可见, 当前自己的事务时可见的,
    b: 若row的trx_id不在视图数组中, 表示这个版本是已提交的事务生成的, 可见

已提交事务 ==> min_id = 200已提交事务max_id=300 ==> 未开始事务

对于删除情况可以认为是update的情况, 会将版本链上最新的数据复制一份, 然后将trx_id修改成删除操作的trx_id, 同时在该条记录的头信息(record header)里的(delete_flag)标记位写上true, 来表示当前记录已经被删除, 在查询时按照上面的规则查到对应的记录如果delete_fla g标记为true, 意味着记录已经被删除, 则不返回结果

事务执行流程

  1. update
  2. 从磁盘DB文件中读取放到 BufferPool 缓存池中进行修改
  3. 写入undo日志以便回滚
  4. 写入redo Log Buffer缓冲区, 写入redo磁盘文件
  5. 写入binlog日志, 提交
  6. 写入commit标记到redo日志文件中,
  7. 开启异步缓存池的数据进行IO线程操作随机时间片写入db文件

当IO线程还没成功, mysql宕机了, 重启时会从redo中查询出来缓存到缓存池buffer Pool

为啥使用redoLog日志?
redo日志为顺序写, 写入磁盘的末尾追加
数据库表每个表一个db文件, 并且经常有删除,需要写到删除的位置. 所以无法追加, 只能随机写

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

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

相关文章

Ai 制作简单的iconfont字体图标

打开网址https://www.iconfont.cn/icons/upload?spma313x.7781069.1998910419.d059fa781 下载矢量图标设计模板,如图 打开下载的图标制作模版.ai文件 点击椭圆工具画一个大小为900*900的圆 点击文字工具&#xff0c;输入文字内容并调整为合适的大小&#xff0c;例610px …

欧科云链OKLink:2023年6月安全事件盘点

一、基本信息 2023年6月REKT和RugPull事件约造成约1000万美元损失&#xff0c;相比上月有显著下降&#xff0c;但安全事件发生数量依旧不减。其中被废弃的Atlantis Loans遭受治理攻击&#xff0c;造成的损失超250万美元&#xff0c;对该协议有过授权的用户需及时撤销授权。另外…

GRU、LSTM、注意力机制(第八次组会)

GRU、LSTM、注意力机制(第八次组会) 一、 GRU二、 LSTM三、 深度RNN、双向RNN四、 注意力机制一、 GRU 二、 LSTM 三、 深度RNN、双向RNN

机器学习实验-决策树、朴素贝叶斯、KNN模型的应用

实验 决策树-西瓜数据集基于基尼系数剪枝人体运动状态预测数据集西瓜数据集人体特征数据集 机器学习 数据集有两个&#xff0c;一个是西瓜数据集&#xff0c;另一个是人体特征数据集 决策树-西瓜数据集 基于信息熵准则进行划分选择的决策树算法的实现过程(不使用现有的机器学习…

有必要使用性能测试工具吗?

有必要使用性能测试工具吗&#xff1f;性能测试工具是一种帮助开发人员和测试人员评估应用程序、网站或系统性能的软件。这些工具主要用于测量响应时间、吞吐量、并发用户数、资源利用率等指标&#xff0c;以及发现系统瓶颈和瓶颈原因&#xff0c;那其作用意义有哪些&#xff1…

Flutter Linux desktop桌面版Build App流程

Flutter Linux desktop桌面版Build App流程 Flutter 是 Google推出并开源的移动应用开发框架&#xff0c;主打跨平台、高保真、高性能。开发者可以通过 Dart语言开发 App&#xff0c;一套代码同时运行在 iOS 和 Android平台。 Flutter提供了丰富的组件、接口&#xff0c;开发者…

maven-mvnd 的使用

maven-mvnd是Apache Maven团队借鉴了Gradle和Takari的优点&#xff0c;衍生出来的更快的构建工具&#xff0c;是maven的强化版。 github地址&#xff1a;https://github.com/apache/maven-mvnd maven-mvnd 特性&#xff1a; 嵌入 Maven (所以不需要单独安装 Maven)&#xff…

【kubernetes系列】kubernetes之initcontainer初始化容器

概述 Init Container就是用来做初始化工作的容器&#xff0c;可以是一个或者多个&#xff0c;如果有多个的话&#xff0c;这些容器会按定义的顺序依次执行&#xff0c;只有所有的Init Container执行完后&#xff0c;主容器才会被启动。我们知道一个Pod里面的所有容器是共享数据…

日本PSE认证341种B类产品为非特定电器和材料类清单

以上清单为官方网站直译&#xff0c;可能存在差异&#xff0c;具体以官方为准。

为什么普通人升级电脑的意愿消逝了

简洁版答案&#xff1a;需求消逝了。 市场调研机构Canalys数据显示&#xff0c;今年一季度&#xff0c;中国市场整体PC出货量同比下降24%至890万台&#xff0c;已是连续第五个季度下跌。今年截至618结束&#xff0c;都没有一家主要的PC厂商愿意发战报。PC市场怎样走出寒冬&…

微服务系列文章之 seata 事务模式

XA模式 XA 规范 是 X/Open 组织定义的分布式事务处理&#xff08;DTP&#xff0c;Distributed Transaction Processing&#xff09;标准。 XA 规范 描述了全局的TM与局部的RM之间的接口&#xff0c;几乎所有主流的数据库都对 XA 规范 提供了支持。 两阶段提交 XA是规范&…

若依新建模块后,swagger扫描不到新模块中的controller接口

框架默认情况下,只能扫描ruoyi-admin模块下的controller接口。如果需要扫描其它子模块中的swagger注解,那么需要调整一下swagger相关内容。 目录 1、前置条件 2、解决办法 1、前置条件 首先,我们要知道,默认情况下swagger依赖包是放置在项目根pom.xml文件中的。 swagge…

Redis三大集群模式

Redis 支持三种集群方案 主从复制模式Sentinel&#xff08;哨兵&#xff09;模式Cluster 模式 为什么要使用集群模式 [1]解决单机故障问题 [2]解决单机压力问题 Redis 集群的三种模式&#x1f349; 一.主从复制模式&#x1f349; 主从复制原理&#x1f95d; 从服务器连接…

【软件测试】高级测试进阶 Centos7安装 Docker容器(详细步骤)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 OS 安装环境要求 …

移动应用加固:政务APP如何保障安全?

政务APP是政府部门为了方便公民办理政务事务而开发的移动应用程序。由于政务APP涉及到大量的敏感信息和政府机密&#xff0c;因此面临着多种安全风险的挑战。《国务院办公厅关于印发全国一体化政务服务平台移动端建设指南的通知》&#xff08;以下简称“通知”&#xff09;要求…

JAVA开发运维(linux环境防火墙与端口开启使用总结记录)

一、问题背景&#xff1a; 将web项目开发完成&#xff0c;需要上到生产环境。那么我们应用调用的一些ip&#xff0c;端口都是要设置的&#xff0c;比如说应用提供给谁访问&#xff0c;那些人不能访问&#xff0c;应用的端口是多少&#xff0c;也是需要开启才能访问的。在实际研…

用BBI指标如何分析平台现货白银走势?

分析平台现货白银走势&#xff0c;主要有几种理论&#xff0c;包括指标类&#xff0c;价格形态类&#xff0c;切线类和K线理论类等几种方法。其实&#xff0c;技术指标依赖投资者开发的算法&#xff0c;被认为是相对更先进的技术&#xff0c;所以也深受很多投资者喜爱。今日&am…

SQL Server创建定时维护计划(备份数据库)

一.备份前将日志收缩至1MB 1.连接数据库——管理——维护计划——新建维护计划 在左下角找到执行T-SQL语句任务将其拖拽到右侧&#xff0c;点击编辑将数据库改为简单模式的SQL语句添加到里面&#xff0c;添加完成后设置执行计划任务 设置执行时间计划任务 2.将数据库log日志收缩…

zynq emio 外接emmc/SD 相关问题与描述总结

在使用emio的情况要注意&#xff0c;由于通过PL的扩展&#xff0c;导致一些问题&#xff0c;如时钟时序&#xff0c;数据、cmd的方向控制都需要注意。 A、emio的clk和clk_fb要短接&#xff08;原因是要通过反馈修复clk输出时序&#xff09;&#xff0c;可通过内部直接短接&…

GC回收器演进之路

目录 未来演进方向 历经之路 引用计数法 标记清除法 复制法 标记整理 分代式 三色标记法的诞生 三色标记法的基本概念 产生的问题 问题 1&#xff1a;浮动垃圾 问题 2&#xff1a;对象消失 遍历对象图不需要 STW 的解决方案 屏障机制 插入屏障&#xff08;Dijks…