《MySQL》事务篇

news2025/1/15 7:17:38

事务特性

ACID

Atomicity原子性:事务中的操作要么全部完成,要么全部失败。

Consistency一致性:事务操作前后,数据满足完整性约束。

Isolation隔离性:允许并发执行事务,每个事务都有自己的数据空间,不会影响其他事务。

Durability持久性:事务操作完后,对数据的修改是永久的。

并行事务问题

1、更新丢失 – 两个事务同时对同一数据进行修改,导致某一个事务的修改的数据丢失。

事务撤销造成的撤销丢失:在事务A修改后(未提交),事务B修改时失败回滚,会同时把事务的修改也回滚了。

事务提交造成的覆盖丢失:事务A修改后(未提交),事务B修改成功,且提交,导致事务A的数据被覆盖。

2、脏读 – 事务执行中读取到了其他事务未提交的数据。

3、读已提交 – 事务读取到其他事务已经提交的数据。

4、不可重复读 – 同一事务中,多次读到的同一数据返回结果不一样。

5、可重复读 – 同一事务中,多次读到的同一数据返回结果一样。

6、幻读 – 在可重复读下,事务A查询某个数据不存在,然后这个时候事务B插入了这个数据,事务A想去插入这个数据时就报错,在可重复读情况下,事务A又去查询这个数据确实不存在。

  • 不可重复读关注的是数据的变化: 一个事务内,相同的查询在不同时间点返回不同的数据。这可能是因为其他事务修改了数据,导致读取到的结果不一致。
  • 幻读关注的是数据的新增或删除: 一个事务内,相同的查询在不同时间点返回了不同数量的行。这可能是因为其他事务在这个范围内插入或删除了数据,导致读取到的结果不一致。

事务隔离级别

SQL 标准定义了四个隔离级别:

  • 读未提交(read uncommitted),指一个事务还没提交时,它做的变更就能被其他事务看到;
  • 读提交(read committed),指一个事务提交之后,它做的变更才能被其他事务看到;
  • 可重复读(repeatable read),指一个事务执行过程中看到的数据,一直跟这个事务启动时看到的数据是一致的,MySQL InnoDB 引擎的默认隔离级别
  • 串行化(serializable);会对记录加上读写锁,在多个事务对这条记录进行读写操作时,如果发生了读写冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行;

ReadView工作模式

img

ReadView中四个重要字段:

  • m_ids:当前数据库中活跃事务(已开启但未提交的事务)id的列表。
  • min_trx_id:活跃事务id列表中最小的事务id。
  • max_trx_id:创建ReadView时,数据库给之后要开启事务的id值。
  • creatot_trx_id:创建该ReadView的事务id。

聚簇索引中的两个隐藏列

  • trx_id:保存当前记录由哪个事务产生或修改的。
  • roll_pointer:每次对记录的改动都会把就版本的记录存入undo日志,该字段就是一个指向旧版本的指针。

判断记录对于某ReadView来说是否可见:

  1. 如果记录隐藏字段的trx_id < ReadView中的min_trx_id,说明记录是在ReadView创建前就有了,所以这条记录是可见的。
  2. 如果记录隐藏字段的trx_id >= ReadView中的max_trx_id,说明记录是在ReadView创建后产生的,所以这条记录是不可见的。
  3. 如果记录隐藏字段的trx_id 在min_trx_id和max_trx_id之间
    • 情况一,trx_id在m_ids中,说明这条记录还没有提交,是不可见的。
    • 情况二,trx_id不在m_ids中,说明这条记录已经提交,是可见的。

读已提交工作模式

怎么解决的读未提交?
在一个事务中每次查询操作都会生成一个ReadView。事务A读取到事务B未提交的数据,根据“判断记录对于某ReadView来说是否可见”中的3-情况一,可知事务A访问不到事务B未提交的数据,所以解决了读未提交。

可重复读工作模式

怎么解决的不可重复读?
在事务启动时生成一个ReadView,之后整个事务中都是同一个ReadView。
根据“判断记录对于某ReadView来说是否可见”中的2可知,对于其他事务已经提交的数据,在该事务中是不可见的。

可重复读未完全解决幻读

在可重复读模式下,普通的select语句是快照读。其他都是当前读。

快照读通过 MVCC 解决幻读,当前读通过 next-key lock 解决幻读。

但仍可能出现幻读场景

情况一:

  • T1 时刻:事务 A 查询 id = 5 的值不存在
  • T2 时刻:事务 B 插入一个 id = 5 的记录并提交;
  • T3 时刻:事务 A 更新 id = 5 的记录。
  • T4 时刻:事务 A 查询 id = 5 的记录,存在!

情况二

  • T1 时刻:事务 A 先执行「快照读语句」:select * from t_test where id > 100 得到了 3 条记录。
  • T2 时刻:事务 B 往插入一个 id= 200 的记录并提交;
  • T3 时刻:事务 A 再执行「当前读语句」 select * from t_test where id > 100 for update 就会得到 4 条记录,此时也发生了幻读现象。

以上的解决方法是,在事务的一开始就使用 select … for update 执行当前读。

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

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

相关文章

【算法刷题】Day26

文章目录 1. 买卖股票的最佳时机含冷冻期题干&#xff1a;算法原理&#xff1a;1. 状态表示&#xff1a;2. 状态转移方程3. 初始化4. 填表顺序5. 返回值 代码&#xff1a; 2. 替换所有的问号题干&#xff1a;算法原理&#xff1a;代码&#xff1a; 1. 买卖股票的最佳时机含冷冻…

web3方向产品调研

每次互联网形态的改变&#xff0c;都会对世界产生很大的影响&#xff0c;上一次对社会产生重大影响的互联网形态&#xff08;Web2.0&#xff09;催生了一批改变人类生活和信息交互方式的企业。 目录 概述DAO是什么&#xff1f;为什么我们需要DAO? 金融服务金融桥接及周边服务D…

在uniapp中使用背景渐变色与背景图不生效问题

list上有文字详情以及背景图&#xff0c;从背景可以看出是渐变色和 背景图片的结合。 因为使用到渐变色&#xff0c;所以要结合 background-blend-mode 属性来实现与背景图片叠加显示&#xff0c;否则只通过 background: linear-gradient(); background-image: url(); 设置不会…

申请sectigo和certum的IP证书注意事项

IP数字证书可以为只有公网IP地址的站点提供网站传输信息加密服务&#xff0c;一方面可以消除用户在浏览器访问网站时的“不安全”提示&#xff0c;另一方面现在主流浏览器会优先收录安装了数字证书的网站&#xff0c;为公网IP地址网站安装IP证书有利于提升网站SEO&#xff08;搜…

openGauss学习笔记-175 openGauss 数据库运维-备份与恢复-导入数据-管理并发写入操作示例

文章目录 openGauss学习笔记-175 openGauss 数据库运维-备份与恢复-导入数据-管理并发写入操作示例175.1 相同表的INSERT和DELETE并发175.2 相同表的并发INSERT175.3 相同表的并发UPDATE175.4 数据导入和查询的并发 openGauss学习笔记-175 openGauss 数据库运维-备份与恢复-导入…

oracle下载

前言&#xff1a; 官网上提供都是最新的什么19c 21c这些版本&#xff0c;我要的是 11g 12c 或者更老的 8i 9i 这些版本。 准备下载一个oracle12c 版本&#xff0c;但是找了很久&#xff0c;最终…详情请看下面 oracle 数据库版本介绍 Oracle数据库有多个长期支持版本&#x…

万字长文谈自动驾驶bev感知(一)

文章目录 prologuepaper listcamera bev :1. Lift, Splat, Shoot: Encoding Images from Arbitrary Camera Rigs by Implicitly Unprojecting to 3D2. M2BEV: Multi-Camera Joint 3D Detection and Segmentation with Unified Birds-Eye View Representation3. BEVDet: High-Pe…

Android原生实现单选

六年前写的一个控件&#xff0c;一直没有时间总结&#xff0c;趁年底不怎么忙&#xff0c;整理一下之前写过的组件。供大家一起参考学习。废话不多说&#xff0c;先上图。 一、效果图 实现思路使用的是radioGroup加radiobutton组合方式。原理就是通过修改RadioButton 的backgr…

Python遥感影像深度学习指南(5)-使用GEE为图像分割创建训练图像patchs

在遥感影像图像分割训练过程中,有些情况下,我们需要从一开始就准备自己的数据集,而如果没有合适的工具,这可能会很耗时。 1、在GEE中选择影像 首先,我们需要一个 GEE 平台的免费账户,可以在 https://signup.earthengine.google.com/ 上轻松获得。然后,我们将进入代码编…

技术资讯:2023编程语言排行榜,出炉啦!

大家好&#xff0c;我是大澈&#xff01; 本文约2000字&#xff0c;整篇阅读大约需要4分钟。 感谢关注微信公众号&#xff1a;“程序员大澈”&#xff0c;免费领取"面试礼包"一份&#xff0c;然后免费加入问答群&#xff0c;从此让解决问题的你不再孤单&#xff01…

C# Winform教程(一):MD5加密

1、介绍 在C#中&#xff0c;MD5&#xff08;Message Digest Algorithm 5&#xff09;是一种常用的哈希函数&#xff0c;用于将任意长度的数据转换为固定长度的哈希值&#xff08;通常是128位&#xff09;。MD5广泛用于校验数据完整性、密码存储等领域。 2、示例 创建MD5加密…

安卓无法下载gradle或者下载gradle只有几十k的时候怎么办

简单说明&#xff1a;检查项目根目录的build.gradle文件&#xff0c;新版本的检查setting.gradle文件&#xff0c;看看repositories中有没有mavenCentral()&#xff0c;没有的话&#xff0c;加上&#xff0c;放在前面&#xff0c;把阿里的镜像也放上maven { url ‘https://mave…

laravel5.8中实现验证码组件的安装和验证

本篇文章主要讲解使用laravel5.8自带的验证码库实现验证码验证的效果教程。通过本教程你可以快速接入到自己的项目中开发相应的验证功能。 作者&#xff1a;任聪聪 (rccblogs.com) 日期&#xff1a;2023年12月17日 实际效果 安装步骤 步骤一、输入命令 composer require mews…

java freemarker 动态生成excel文件

好久木有更新啦 抓住2023的小尾巴 浅浅更新一下吧~ 最近做了一个动态生成excel的功能&#xff0c;这里记录下部分功能&#xff0c;主要用到的是freemarker框架&#xff0c;spring就有带&#xff0c;我起的demo载入了一下freemarker的jar包 一、创建模板 首先可以创建一个e…

MySQL进阶之(一)逻辑架构

一、逻辑架构 1.1 逻辑架构剖析1.1.1 连接层1.1.2 服务层01、基础服务组件02、SQL Interface&#xff1a;SQL 接口03、Parser&#xff1a;解析器04、Optimizer&#xff1a;查询优化器05、Caches & Buffers&#xff1a; 查询缓存组件 1.1.3 引擎层1.1.4 存储层1.1.5 总结 1.…

【JavaEE】多线程(6) -- 定时器的使用及实现

目录 定时器是什么 标准库中的定时器的使用 实现定时器 定时器是什么 Java中的定时器是一种机制&#xff0c;用于在预定时间执行某个任务。它允许开发人员在指定的时间间隔内重复执行任务&#xff0c;或在指定的延迟之后执行任务。定时器是Java提供的一种方便的工具&#xf…

【没有哪个港口是永远的停留~论文简读】HRNet+OCR

一、Deep High-Resolution Representation Learning for Human Pose Estimation &#xff08;HRNet&#xff09; 论文&#xff1a;https://arxiv.org/pdf/1902.09212.pdf 代码&#xff1a;https://github.com/leoxiaobin/deep-high-resolution-net.pytorch 二、Deep high-res…

JAVA——JDBC学习

视频连接&#xff1a;https://www.bilibili.com/video/BV1sK411B71e/?spm_id_from333.337.search-card.all.click&vd_source619f8ed6df662d99db4b3673d1d3ddcb 《视频讲解很详细&#xff01;&#xff01;推荐》 JDBC&#xff08;Java DataBase Connectivity Java数据库连…

并行进位加法器

前言 在文章逻辑运算加法器中&#xff0c;介绍了两种加法运算方式&#xff0c;串行进位加法器和进位选择加法器&#xff0c;我们给出了逻辑门的实现并给出了C语言描述&#xff0c;本篇文章介绍另外一种加法计算方法&#xff1a;并行进位加法器 写在前面 使用 ⨁ \bigoplus ⨁…

rime中州韵 symbols.custom.yaml 配置

今天我们所做的配置&#xff0c;将实现扩展符号的输入效果&#xff0c;如下&#x1f447;&#xff1a; 基础扩展符号的配置 要实现输入法能够输入扩展的符号&#xff0c;我们需要在输入方案中引入扩展符号集。 如果你使用的输入方案是 wubi_pinyin.schema.yaml&#xff0c;…