MySQL :事务隔离级别实现方法

事务具有四个特性

  • 原子性,要么全成功要么全失败,通过undo log实现
  • 持久性,不会因为断电等特殊情况造成数据丢失,通过redo log实现
  • 隔离性,事务之间互相不干扰,通过MVCC实现
  • 一致性,事务执行前后整体一致,通过原子性,持久性,隔离性一起保证

下面着重介绍隔离性

并发读写数据会产生三种异常情况

  • 脏读,读到了别的事务没有提交的数据,没有提交随时可能回滚,所以容易出错
  • 幻读,两次读取的结果集不同,事务执行期间别的事物添加了新的数据
  • 不可重复读,两次读取内容不同,事务执行期间别的事务修改了这条数据的内容

事务隔离级别

  • 读未提交,可以读到没有提交的数据,存在脏读、幻读、不可重复读问题
  • 读提交,只能读到提交的数据,存在幻读、不可重复度问题
  • 可重复读,读的数据一直是事务开始时的状态,存在幻读问题(InnoDB默认隔离级别)
  • 串行化,没有问题,但是并发性太差

读未提交显然就是不采用任何机制控制,串行化就是利用锁控制事务一个一个执行,这两种一般情况下不会使用,重点是读提交和可重复读,这两种隔离级别都是通过read view实现的,不同点在于read view的时机不同,读提交是在每个任务执行前创建一个read view而可重复读则是事务开始时创建一个read view然后整个事务执行期间都使用这一个read view。

Read View 在 MVCC 里如何工作的?

read view 四个字段

creator_trx_idm_idsmin_trx_idmax_trx_id
创建该read view的事务的事务id创建read view时,当前数据库中【活跃且未提交】的事务id列表创建read view时当前数据库中活跃且未提交的事务中最小事务id创建read view时当前数据库中应该给下一个事务的id

在这里插入图片描述

  • 聚簇索引记录中两个事务相关的隐藏列(trx_id/roll_ptr)
    在这里插入图片描述
    trx_id:产生当前数据的事务id
    roll_ptr:指向undo log中上一个版本的数据

使用当前数据(最新/undo log)对应的事务id和这几个参数进行对比可以快速的确定该读哪个版本的事务数据,同时roll_ptr下维持有一个相同结构的链表因此可以快速的找到具体数据。

这种通过「版本链」来控制并发事务访问同一个记录时的行为就叫 MVCC(多版本并发控制),利用这种机制快照读可以有效的避免一些幻读现象。

然而只有一些简单的查询语句可以使用这种快照读,更多情况下使用的是当前读,比如update的时候如果另一个事务delet掉了这条数据使用快照读最终是提交不了的,交叉使用快照读和当前读非常容易产生幻读情况,为了处理这种情况引入了间隙锁,当进行当前读的时候范围加锁避免其它事务提交而造成数据不一致,但是这种情况并不能完全解决幻读情况,比如:

  • 事务A执行select查询不到(快照读未加间隙锁)
  • 事务Binsert了可以被select查询到的记录并提交了
  • 事务B修改可以查询到的数据,尽管前面没有查询到,但是现在因为事务B的行为可以进行修改了
  • 于是产生了幻读情况。

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

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

相关文章

双指针运用:删除重复元素、移除元素

26.删除重复元素 题目描述 给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元…

Android Gradle开发与应用 (八) :Kotlin DSL

1. 前言 本文介绍了Gradle Kotlin DSL相关的一些知识点 2. DSL是什么 DSL是为特定领域设计的专门的语言,也就是设计了一门语言,然后解决某个特定的领域的特定问题。 2.1 举例说明 以下的这些都可以称之为DSL 正则表达式 :用于文本处理的特定语言SQ…

Java中volatile关键字

保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的,volatile关键字会强制将修改的值立即写入主存。 1.volatile的可见性 一个典型的例子:永不停止的循环。 public class Forever…

【python】Python上海二手房数据分析可视化(数据集+源码+报告)【独一无二】

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

Electron 桌面端应用的使用 ---前端开发

Electron是什么? Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium 和 Node.js 到 二进制的 Electron 允许您保持一个 JavaScript 代码代码库并创建 在Windows上运行的跨平台应用 macOS和Linux——不需要本地开发 经验。 入门…

Spring Boot - 利用MDC(Mapped Diagnostic Context)实现轻量级同步/异步日志追踪

文章目录 Pre什么是MDC(Mapped Diagnostic Context)Slf4j 和 MDC基础工程工程结构POMlogback-spring.xmlapplication.yml同步方式方式一: 拦截器自定义日志拦截器添加拦截器 方式二: 自定义注解 AOP自定义注解 TraceLog切面 测试…

ES查询和监控

es安装 参考https://blog.csdn.net/okiwilldoit/article/details/137107087 再安装kibana,在它的控制台里写es查询语句。 es指南 es权威指南-中文版: kibana用户手册-中文版: es中文社区 es参考手册API es客户端API es查询语句 # 查询e…

Spring Boot:Web开发之三大组件的整合

Spring Boot 前言Spring Boot 整合 ServletSpring Boot 整合 FilterSpring Boot 整合 Listener前言 在 Web 开发中,Servlet 、Filter 和 Listener 是 Java Web 应用中的三大组件。Servlet 是 Java 代码,通过 Java 的 API 动态的向客户端输出内容。Filter 是处于客户端与服务…

74HC595引脚图时序图工作原理

74HC595和74hc164一样是在单片机系统中常用的芯片之一他的作用就是把串行的信号转为并行的信号,常用在各种数码管以及点阵屏的驱动芯片, 使用74HC595可以节约单片机mcu的io口资源,用3个io就可以控制8个数码管的引脚,他还具有一定的…

Node.js模块的导出

在Node.js中,module.exports 和 exports 是两种导出模块的方式,它们的作用是使得模块中的内容可以被其他模块引用和使用。 module.exports: module.exports 是一个指向当前模块所导出内容的对象的引用。你可以通过给 module.exports 赋值来导出一个对象…

3D-Aware Multi-Class Image-to-Image Translation with NeRFs

3D-Aware Multi-Class Image-to-Image Translation with NeRFs 利用NeRFs实现3D感知的多类图像到图像的翻译 Senmao Li1  Joost van de Weijer2  Yaxing Wang1 李森茂 1 范德维杰 2 王亚兴 1  Fahad Shahbaz Khan3,4  Meiqin Liu5  Jian Yang1 法哈德夏巴兹汗 3,4 刘梅琴 …

CPU架构之---SMP、NUMA

一、缩略词: 缩略词全称含义SMPSymmetric Multi processing对称多处理器(UMA)NUMA(Non-Uniform Memory Access)非一致性内存访问UMAUniform Memory Architecture一致性内存访问 二、SMP简述和框架 2.1 smp简述 SMP(Symmetric M…

随动系统同步性问题(跟随给定和跟随反馈的区别)

1、运动控制比例随动 运动控制比例随动系统_正运动随动系统-CSDN博客文章浏览阅读1.4k次,点赞2次,收藏5次。PLC如何测量采集编码器的位置数据,不清楚的可以参看我的另一篇博文:三菱FX3U PLC高速计数器应用(附代码)_RXXW_Dor的博客-CSDN博客本文主要以三菱FX3U系列的高速…

vue2创建项目的两种方式,配置路由vue-router,引入element-ui

提示:vue2依赖node版本8.0以上 文章目录 前言一、创建项目基于vue-cli二、创建项目基于vue/cli三、对吧两种创建方式四、安装Element ui并引入五、配置路由跳转四、效果五、参考文档总结 前言 使用vue/cli脚手架vue create创建 使用vue-cli脚手架vue init webpack创…

使用Redis实现用户最近浏览记录

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 Redis是一个key-va…

使用ROCm的HIP API向量加法程序

一、向量加法程序 Radeon Open Compute (ROCm) 是一个开源平台,用于加速高性能计算 (HPC) 和机器学习应用程序。它支持包括GPUs在内的多种硬件,并提供HIP (Heterogeneous-compute Interface for Portability) 作为CUDA代码的便捷转换工具。为了提供一个…

[spring] rest api security

[spring] rest api security 之前的 rest api CRUD 都没有实现验证(authentication)和授权(Authorization),这里使用 Spring security 进行补全 spring security 是一个非常灵活、可延伸的实现方式,比较简…

C语言 | Leetcode C语言题解之第19题删除链表的倒数第N个结点

题目: 题解: struct ListNode* removeNthFromEnd(struct ListNode* head, int n) {struct ListNode* dummy malloc(sizeof(struct ListNode));dummy->val 0, dummy->next head;struct ListNode* first head;struct ListNode* second dummy;f…

安装 Kali NetHunter (完整版、精简版、非root版)、实战指南、ARM设备武器化指南、andrax、安卓渗透drozer

From:https://www.kali.org/docs/nethunter/ NetHunter 实战指南:https://www.vuln.cn/6430 乌云 存档:https://www.vuln.cn/wooyundrops 1、Kali NetHunter Kali NetHunter 简介 Net(网络),hunter&#x…

FFmpeg: 自实现ijkplayer播放器-02环境搭建

文章目录 安装环境项目工程配置库文件 安装环境 IDE: Qt5.12 库: ffmpeg-4.2.1-win32SDL 项目工程配置 pro文件 TEMPLATE app TARGET SimpleIJKPlayer DESTDIR bin QT core gui widgets #CONFIG debug #DEFINES _UNICODE WIN64 QT_WIDGETS_LIBwin32 { LIBS -L$$PW…