mysql事务(MVCC机制:undo日志)(mysql执行过程:redo日志,Buffer Pool缓存池)

事务

目的:保证数据的最终一致性## 事务的目的

事务的4大特性(ACID)

1.原子性(Atomicity):由undo log日志来保证
2.一致性(Consistency):使用事务的最终目的,由业务代码正确逻辑保证,比如错误的try-catch
3.隔离性(Isolation):在事务并发执行时,他们内部的操作不能互相干扰
4.持久性(Dur©bility):一旦提交了事务,对数据库的改变就应该是永久性的。由redo log日志来保证
在这里插入图片描述

事务的隔离级别(4种)

事务隔离级别:从小到大,级别越高,数据直接影响越小
1.read uncommit 读未提交
2.read commit 读已提交:oracle 数据库默认
3.repeatable read 可重复度 :mysql 数据库默认
4.serializble 串行

每个隔离级别的缺点:
1.读未提交:读到了没有提交的数据,即脏读,性能很高,但不会使用
2.读已提交:不可重复读,在当前事务中,(由于其他事务已提交)每次读取到的数据都不一样,例如,在一个方法中,第一次读取时值是100,当其他事务提交后,将该值改为200,那么在该事务中再次读取时,就会变成200。
3.可重复读:幻读,脏写,在当前事务中,不管其他事务怎么提交数据,每次读到的值都一样。
4.串行:阻塞,效率低,当前事务未执行完,其余事务都得排队等待。

在这里插入图片描述

MVCC机制(多版本并发控制)(undo日志版本链)

引申:写时复制 机制(copy on write ):更新副本,然后进行替换。
这样机制优点是:读写分离,这样不管读操作和写操作,都可以支持并发。
虽然在替换过程中,可能会读到旧数据,但是在并发场景下可以接收

MVCC :undo.log日志版本链
在这里插入图片描述

流程实现
数据库在每次插入数据时,每条数据都有对应的事务id和回滚指针
1.数据每次操作后,会在undo.log 日志中插入一条回滚数据,并标记事务和回滚指针
2.在每次写的时候,都是先复制,再修改。

读已提交,指的就是每次都读最新提交的数据
可重复读,指的是每次都读和当前事务绑定的数据
在这里插入图片描述

暴露问题

可重复读:脏写问题
原因:可重复读会读到之前版本的数据,利用之前的数据进行操作后,来修改数据库,这样就会出现脏写的问题
解决:
1.利用乐观锁
数据库增加版本字段,每次查询和修改时带上版本号,然后可以在业务代码中来循环重试根据版本号进行修改,直到修改成功。
在这里插入图片描述

2.直接数据库进行操作,这样会加悲观锁
在这里插入图片描述

mysql执行过程(持久性的实现)

redo日志(Buffer Pool缓存池)

1.写入数据时,InnoDB 会先将数据先放到 Buffer Pool缓存池
2.然后将要回滚的数据写入到undo日志
3.同步的会写到 redo日志(先写到redori值缓存,然后再写的redo 日志磁盘文件)(写入redo 日志成功,就表示数据写成功)
4.同时会写到binlog日志
5.再将缓存数写入到**.ibd数据**文件

写入redo 日志和写入 ibd 文件的区别

顺序写:顺序写的效率远高于随机写
rdeo 日志是顺序写,每次都是在文件末尾追加
ibd文件是随机写,每张表都有对应的ibd文件,所以无法顺序写
在这里插入图片描述

查询方法需要事务吗?

查询方法中有多条查询语句,若隔离级别时可重复读,则需要开启事务
基于时间维度,对于统计报表等来讲,使用事务可以读到同一时间点的数据。这样数据的一致性会更高

对于高并发场景下的公司,一般使用读已提交。
对于传统公司,需要更多报表统计的公司,使用可重复度,保证同一时间点的数据一致性。

事务优化

长事务:
在这里插入图片描述
优化方案:
1.查询放到事务外
2.处理数据过多,则拆分多个事务处理
3.先insert后update,更新update操作放到事务后面,insert 放到前面(update 语句其他其他事务可能会用到)
4.应用侧保证一致:即放弃事务,回滚操作等放到代码中实现
在这里插入图片描述

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

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

相关文章

在任意一个文件下,进入cmd

直接在界面上输入cmd,回车就出来了

安卓六大布局

LinearLayout(线性布局) 1.简介 线性布局在开发中使用最多,具有垂直方向与水平方向的布局方式。LinearLayout 默认是垂直排列的,但是可以通过设置 android:orientation 属性来改变为水平排列。 2.常用属性 orientation&#xf…

Windows系统下载安装Emby结合内网穿透实现公网访问本地影音网站

文章目录 1.前言2. Emby网站搭建2.1. Emby下载和安装2.2 Emby网页测试 3. 本地网页发布3.1 注册并安装cpolar内网穿透3.2 Cpolar云端设置3.3 Cpolar内网穿透本地设置 4.公网访问测试5.结语 1.前言 在现代五花八门的网络应用场景中,观看视频绝对是主力应用场景之一&…

3.2 RK3399项目开发实录-初次使用的环境搭建(物联技术666)

通过百度网盘分享的文件:嵌入式物联网单片… 链接:https://pan.baidu.com/s/1Zi9hj41p_dSskPOhIUnu9Q?pwd8qo1 提取码:8qo1 复制这段内容打开「百度网盘APP 即可获取」 1. 用户和密码 1.1. Ubuntu Desktop 系统 Ubuntu Desktop 系统开机启动后,自动登录…

权限管理和操作指令

文章目录 前言一、文件的权限分类二、操作时无相应权限解决办法1.使用sudo指令2.修改文档权限 总结 前言 💦 Linux操作系统中,主要都是对文件进行操作,完成读写或者执行功能。Ubuntu 下我们会常跟用户权限打交道,权限就是用户对于…

python操作dataframe--打乱df的顺序

在Python中,可以使用Pandas库来操作DataFrame。要打乱DataFrame的顺序,可以使用sample方法来实现。以下是一个示例代码: import pandas as pd# 创建一个示例DataFrame data {A: [1, 2, 3, 4, 5],B: [10, 20, 30, 40, 50]} df pd.DataFrame…

为什么ERP与MES集成那么难搞?怎么有效解决这一难题

在现代企业信息化进程中,ERP(企业资源规划)和MES(制造执行系统)作为企业管理的核心信息系统,它们之间的深度集成是提升生产效率、实现精益管理和智能决策的关键环节。然而,ERP与MES集成并非易事…

【Python】成功解决NameError: name ‘sns‘ is not defined

【Python】成功解决NameError: name ‘sns’ is not defined 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程👈 希望得到您…

1个二维码能包含多个视频吗?制作视频二维码的方法

二维码在生活中现在随处可见,除了用于支付之外,展示内容也可以通过二维码来展现,比如常见的视频、图片、文件、音频等内容都可以通过二维码来展现。那么当我们需要将多个视频存入一个二维码中展示时,该如何利用二维码生成器的工具…

开发知识点-python-Tornado框架

介绍 Tornado是一个基于Python语言的高性能Web框架和异步网络库,它专注于提供快速、可扩展和易于使用的网络服务。由于其出色的性能和灵活的设计,Tornado被广泛用于构建高性能的Web应用程序、实时Web服务、长连接的实时通信以及网络爬虫等领域。 Torna…

jmeter接口自动化测试通过csv文件读取用例并执行测试

最近在公司测试中经常使用jmeter这个工具进行接口自动化,简单记录下~ 一、在csv文件中编写好用例 首先在csv文件首行填写相关参数(可根据具体情况而定)并编写测试用例。脚本可通过优先级参数控制执行哪些接口,通过端口参数同时执…

leetcode110.平衡二叉树

之前没有通过的样例 return语句只写了一个 return abs(l-r)<1缺少了 isBalanced(root->left)&&isBalanced(root->right);补上就好了 class Solution { public:bool isBalanced(TreeNode* root) {if(!root){return true;}int lgetHeight(root->left);i…

第三百九十一回

文章目录 1. 概念介绍2. 方法与细节2.1 实现方法2.2 具体细节 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何混合选择多个图片和视频文件"相关的内容&#xff0c;本章回中将介绍如何通过相机获取视频文件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. …

很多人不懂这个伦敦金短线操作的心法

很多投资者进入伦敦金市场&#xff0c;是看中了它很适合短线操作的这个特点。确实&#xff0c;伦敦金不光可以实现双向T0的交易&#xff0c;而且还有24小时交易和保证金交易的特点&#xff0c;这些特点令伦敦金成为一个十分适合短线交易的品种。但是投资者如何在伦敦金短线交易…

提高转换效率的利器NCP13992ACDR2G 高性能电流模式LLC谐振变换器控制芯片

NCP13992ACDR2G产品概述&#xff1a; NCP13992ACDR2G是一款用于半桥谐振变换器的高性能电流模式控制器。该控制器实现了600 V栅极驱动器&#xff0c;简化了布局并减少了外部组件数量。内置的Brown−Out输入功能简化了控制器在所有应用程序中的实现。在需要PFC前级的应用中&…

RUST 每日一省:rust logo收集

rust的logo集合&#xff0c;看看有没有你喜欢的&#xff0c;挑一个吧&#xff1b; GitHub - XuHugo/rust-logo: Collection of logo images for all rust languages 下边只是挑选了几个&#xff0c;更多的还是看github吧。

mysql 主从延迟分析

一、如何分析主从延迟 分析主从延迟一般会采集以下三类信息。 从库服务器的负载情况 为什么要首先查看服务器的负载情况呢&#xff1f;因为软件层面的所有操作都需要系统资源来支撑。 常见的系统资源有四类&#xff1a;CPU、内存、IO、网络。对于主从延迟&#xff0c;一般会…

【LeetCode热题100】206. 反转链表(链表)

一.题目要求 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 二.题目难度 简单 三.输入样例 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1] 示例 2&#xff1a; 输入&#xff1a;head [1,2…

TS使用el-tree拖拽结构+点击写法

1.结构分两块 <template><div style"height:96%;width:100%;max-width:1920px;max-height:1080px;background-color:white;padding:20px;display: flex;flex-direction:row; "><!-- 左侧树 --><div style"height:100%;width:32%;"&g…

【刷题节】美团2024年春招第一场笔试【技术】

1.小美的平衡矩阵 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);int n scanner.nextInt();int[][] nums new int[n][n], sum new int[n][n];char[] chars;for (int i 0; i < n; i) {…