《MySQL》事务篇

事务特性

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.hqwc.cn/news/305849.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

程序员的浪漫,2023跨年烟花代码(Python)

跨年倒计时啦 今天分享用python实现一场烟花秀 感兴趣的小伙伴&#xff0c;提前收藏起来&#xff0c;一定要看到最后&#xff01; 话不多说 1.首先制作一个绚丽的夜空 制作夜空&#xff0c;其实就是设置画布。大家知道&#xff0c;夜晚的天空月明如水&#xff0c;星光攒动&a…

案例260:基于微信小程序的签到系统的设计与实现

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder …

Jackson通过自定义序列化器给URL拼接访问域名

1、需求 在存储文件访问路径时&#xff0c;一般不会存储域名地址&#xff0c;若文件服务域名和当前应用域名不一致时&#xff0c;就需要在返回数据库的图片路径给前端时&#xff0c;拼接文件服务的域名。 2、处理方式 因为Spring Boot默认使用的是Jackson作为序列化工具&…

金融贷款行业怎么精准获客,电销打吐了!教你两招

助贷行业&#xff0c;一般都会设有kpi&#xff0c;压力竞争都不小。虽然现在贷款电销大家对此意见不同&#xff0c;但是&#xff0c;不可否认&#xff0c;这个行业&#xff0c;电销就是它们最快速的获客方式。只要耐得住性子&#xff0c;有一份精准的话单&#xff0c;就可以开工…

Appium+python自动化(七)- 初识琵琶女Appium(千呼万唤始出来,犹抱琵琶半遮面)- 上(超详解)

简介 “千呼万唤始出来&#xff0c;犹抱琵琶半遮面”&#xff0c;经过前边的各项准备工作&#xff0c;终于才把appium这位琵琶女请出来。那么下边就由宏哥给各位看官、小伙伴们和童鞋们来引荐这位美女&#xff08;帅哥&#xff09;。这一篇主要是对前边的内容做一个小小的总结&…

快乐学Python,Python基础之如何控制代码执行顺序?【分支结构和循环结构】

在上一篇文章中&#xff0c;我们所操作的所有代码都是顺序执行的。什么意思呢&#xff1f;就是我们在所有例子中的代码&#xff0c;计算机都是从第一句开始执行&#xff0c;执行完毕后执行第二句&#xff0c;以此类推&#xff0c;最终执行完整个代码块。 以下面代码为例&#…

Linux高级管理——yum仓库服务

一、部署yum软件仓库&#xff1a; 借助于YLM软件仓库&#xff0c;可以完成安装&#xff0e;卸载、自动升级rpm软件包等任务。YUM的前身是YUP (Yellow dog Updater, Yellow dog Linux的软件更新器),最初由TSS公司&#xff08;TerraSoft Solutions&#xff0c;INC.&#xff09;使…

日常中msvcp120.dll丢失五种解决方法

在日常使用电脑的过程中&#xff0c;我们可能会遇到一些错误提示&#xff0c;其中之一就是“msvcp120.dll丢失”。那么&#xff0c;msvcp120.dll到底是什么&#xff1f;它的作用又是什么呢&#xff1f;为什么会出现丢失的情况呢&#xff1f;本文将为您详细介绍msvcp120.dll的相…

【网络技术】【Kali Linux】Wireshark嗅探(二)TCP协议

一、实验目的 本次实验使用wireshark流量分析工具进行网络嗅探&#xff0c;旨在了解TCP协议的原理以及连接建立过程。 二、网络环境设置 本次实验使用Kali Linux虚拟机完成&#xff0c;主机操作系统为Windows11&#xff0c;虚拟化平台选择Oracle VM VirtualBox&#xff0c;组…

JVM篇:JVM的简介

JVM简介 JVM全称为Java Virtual Machine&#xff0c;翻译过来就是java虚拟机&#xff0c;Java程序&#xff08;Java二进制字节码&#xff09;的运行环境 JVM的优点&#xff1a; Java最大的一个优点是&#xff0c;一次编写&#xff0c;到处运行。之所以能够实现这个功能就是依…

vue动态路由,三级及以上路由,地址跳转,但是页面不显示

vue动态路由的时候,一级,二级路由都正常展示,但是三级,四级,五级等就只看到地址跳转了,但是页面并没有跳转,原因是共用了一个<router-view></router-view> import Layout from /layout import Vue from vue import Router from vue-router import db from /utils/…

由浅入深走进Python异步编程【协程与yield】(含代码实例讲解 || 迭代器、生成器、协程、yield from)

写在前面 从底层到第三方库&#xff0c;全面讲解python的异步编程。这节讲述的是python异步编程的底层原理第一节&#xff0c;详细了解需要配合下一节观看哦。纯干货&#xff0c;无概念&#xff0c;代码实例讲解。 本系列有6章左右&#xff0c;点击头像或者专栏查看更多内容&…