(四十四)多个事务更新同一行数据时,是如何加锁避免脏写的?

news2024/11/14 20:34:45

之前我们已经用很多篇幅给大家讲解了多个事务并发运行的时候,如果同时要读写一批数据,此时读和写时间的关系是如何协调的,毕竟要是你不协调好的话,可能就会有脏读、不可重复读、幻读等一系列的问题。

简单来说,脏读、不可重复读、幻读,都是别人在更新数据的时候,你怎么读的问题,读的不对,那就有问题,读的方法对了,那就不存在这一系列问题了。

而你要解决这一系列问题,其实就是依靠之前我们给大家讲的那套,基于undo log版本链条以及ReadView实现的mvcc机制。

现在开始我们接下来要用一系列的篇幅来研究另外一个问题了,那就是当有多个事务同时并发更新一行数据的时候,不就是会有脏写的问题吗?

我们之前讲过,脏写是绝对不允许的,那么这个脏写是靠什么防止的呢?

说白了,就是靠锁机制,依靠锁机制让多个事务更新一行数据的时候串行化,避免同时更新一行数据,今天我们就先对数据库的锁机制做一个初步的入门讲解。

在MySQL里,假设有一行数据摆在那儿不动,此时有一个事务来了要更新这行数据,这个时候他会先琢磨一下,看看这行数据此时有没有人加锁?

一看没人加锁,太好了,说明他是第一个人,捷足先登了。

此时这个事务就会创建一个锁,里面包含了自己的trx_id和等待状态,然后把锁跟这行数据关联在一起。

同时大家应该还记得,更新一行数据必须把他所在的数据页从磁盘文件里读取到缓存页里来才能更新的,所以说,此时这行数据和关联的锁数据结构,都是在内存里的,大家要明确这一点,如下图。

image-20230108130721842

大家注意看上面的那个图,因为事务A给那行数据加了锁,所以此时就可以说那行数据已经被加锁了

那么既然被加锁了,此时就不能再让别人访问了!如果有朋友对加锁的概念不了解,可能是对编程语言不太了解,其实这个就跟Java里的加锁是一个概念。

现在呢,有另外一个事务B过来了,这个事务B就也想更新那行数据,此时就会检查一下,当前这行数据有没有别人加锁

然而他一下子发现,真是糟糕啊,事务A这家伙太不地道了,居然抢先给这行数据加锁了,这怎么办呢?

事务B这个时候一想,那行,我也加个锁,然后等着排队不就得了,这个时候事务B也会生成一个锁数据结构,里面有他的trx_id,还有自己的等待状态,但是他因为是在排队等待,所以他的等待状态就是true了,意思是我在等着呢,如下图。

image-20230108130744649

接着事务A这个时候更新完了数据,就会把自己的锁给释放掉了。锁一旦释放了,他就会去找,此时还有没有别人也对这行数据加锁了呢?他会发现事务B也加锁了

于是这个时候,就会把事务B的锁里的等待状态修改为false,然后唤醒事务B继续执行,此时事务B就获取到锁了,如下图。

image-20230108130803117

上述就是MySQL中锁机制的一个最基本的原理,大家可以先好好理解一下,其实是跟Java里的锁机制,思路是完全类似的,从这种简单的锁里可以引申出很多其他的概念,比如读写锁,共享锁,独占锁,公平锁,非公平锁,等等。Java里的锁,也同样具备这些锁的概念。

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

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

相关文章

SpringMvc中HandlerAdapter组件的作用

概述 我们在使用springMVC时,都知道其中不仅包含handlerMapping组件还包含handlerAdapter组件,为什么呢? springMVC请求流程图 HandlerAdapter组件使用了适配器模式 适配器模式的本质是接口转换和代码复用,这里使用适配器模式的…

房屋出租管理系统

1. 铺垫 1.1 项目真实开发的过程 上来要做什么???? 有电脑—》配环境(JDK、IDEA、MAVEN……) 这个项目:房屋管理系统 从什么角度出发,第一步做什么?? 架构 …

晶体塑性有限元 Abaqus 三维泰森多边形(voronoi模型)插件 V7.0

1 上一版本完整功能介绍: Voronoi晶体插件-6.0版本[新功能介绍] 晶体塑性有限元 Abaqus 三维泰森多边形(voronoi模型)插件 V6.0 2 新增功能模块 7.0版本新增功能模块包括:柱状晶体模块和分层晶体模块。 2.1 二维柱状晶体模块 …

macOS使用CodeRunner快速配置fortran环境

个人网站:xzajyjs.cn 由于一些项目的缘故,需要有fortran的需求,但由于是M1 mac的缘故,不能像windows那样直接使用vsivf这种经典配置。搜了一下网上主流的跨平台方案,主要是gfortran,最近用Coderunner(主要…

【Linux】网络套接字编程

前言 在掌握一定的网络基础,我们便可以先从代码入手,利用UDP协议/TCP协议进行编写套接字程序,明白网络中服务器端与客户端之间如何进行连接并且通信的。 目录 一、了解源目的IP、端口、网络字节序、套接字 端口号: 套接字&…

深入探究文件I/O

目录Linux 系统如何管理文件静态文件与inode文件打开时的状态返回错误处理与errnostrerror 函数perror 函数exit、_exit、_Exit_exit()和_Exit()函数exit()函数空洞文件概念实验测试O_APPEND 和O_TRUNC 标志O_TRUNC 标志O_APPEND 标志多次打开同一个文件验证一些现象多次打开同…

MS9132是一款USB 3 0投屏芯片,内部集成USB 3 0 Device控制器、数据收发模块、音视频处理模块

MS9132是一款USB 3.0投屏芯片,内部集成USB 3.0 Device控制器、数据收发模块、音视频处理模块。MS9132可以通过USB 3.0接口将PC、智能手机、平板电脑上的信息显示或扩展到更大尺寸的显示设备,支持HDMI视频接口输出。 主要功能特征 HDMI 1.4b兼容 支持EDI…

C语言汉诺塔问题【图文详解】

汉诺塔1. 什么是汉诺塔2. 有关汉诺塔的有趣故事3. 利用动画来演示汉诺塔4. 如何用C语言实现汉诺塔1. 什么是汉诺塔 源于印度古老传说的益智玩具 汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大梵天创造…

一起Talk Android吧(第五百零六回:如何调整组件在约束布局中的角度)

文章目录背景介绍相关属性使用方法示例程序各位看官们大家好,上一回中咱们说的例子是"如何调整组件在约束布局中的大小",这一回中咱们说的例子是"如何调整组件在约束布局中的角度"。闲话休提,言归正转, 让我们一起Talk A…

2、算法先导---思维能力与工具

题目 碎纸片的拼接复原(2013B) 内容 破碎文件的拼接在司法物证复原、历史文献修复以及军事情报获取等领域都有着重要的应用。传统上,拼接复原工作需由人工完成,准确率较高,但效率很低。特别是当碎片数量巨大,人工拼接很难在短时…

QT之OpenGL混合

QT之OpenGL混合1. 概述2. 实现2.1 丢弃片段2.1.1 Demo2.2 混合2.2.1 相关函数2.2.2 排序问题2.2.3 Demo1. 概述 OpenGL中,混合(Blending)通常是实现物体透明度(Transparency)的一种技术。 2. 实现 2.1 丢弃片段 在某些情况下,有些片段是只需要设置显…

尚医通(二十四)微信退款(取消预约功能)

目录一、取消预约1、需求描述2、开发取消预约接口一、取消预约 1、需求描述 取消订单分两种情况: (1)未支付取消订单,直接通知医院更新取消预约状态 (2)已支付取消订单,先退款给用户&#xff…

《程序是如何跑起来的》-----读书笔记篇

程序是如何跑起来的前言磁盘与内存的关系虚拟内存dll 文件运行环境从源文件到可执行文件前言 不得不说,在这个假期借助“微信阅读”读到了很多有意义的书。不仅是思想境界上的,还有专业方向的。这一次我是在周三还是周四的一个活动中淘到了这本书&#x…

Nginx的介绍、安装与常用命令

前言:传统结构上(如下图所示)我们只会部署一台服务器用来跑服务,在并发量小,用户访问少的情况下基本够用但随着用户访问的越来越多,并发量慢慢增多了,这时候一台服务器已经不能满足我们了,需要我们增加服务…

随机过程及应用

随机过程及应用一、概率论基础1. 三元体定义2. 随机变量及其分布1. 离散随机变量2. 连续型随机变量3. 常见的随机变量和分布1. 离散类2. 连续类4. 二维连续随机变量1. 二维离散2. 二维连续5. 随机变量函数的分布1. 离散(可浅看)2. 一维连续 r.v 函数分布…

JS学习第3天——Web APIs之DOM(什么是DOM,相关API【创建、增删改查、属性操作、事件操作API】)

目录一、Web APIs介绍1、API2、Web API二、DOM1、DOM树2、获取元素3、事件基础4、操作元素属性5、节点(node)操作三、DOM操作总结(创建、增删改查、属性操作、事件操作API)1、创建2、增3、删4、改5、查6、属性操作7、事件操作四、…

[QCustomPlot] QCPBar绘制柱状图并同时显示柱状图的值

前言 博主在使用 qcustomplot 绘制柱状图时,发现网络上的教程。大都忽略了一个重要的点就是。柱状图没有明显显示出当前的值。经过博主寻找后发现在 qcustomplot 论坛中已经有了对应的解决方案。所以记录一下。qcustomplot论坛 代码 void MainWindow::drawBars()…

【N32WB03x SDK使用指南】

【N32WB03x SDK使用指南】1. 简介1.1 产品简介1.2 主要资源1.3 典型应用2. SDK/开发固件文件目录结构2.1 doc2.2 firmware2.3 middleware2.4 utilities2.5 projects Projects3. 项目配置与烧录3.1 编译环境安装3.2 固件支持包安装3.3 编译环境配置3.4 编译与下载3.5 BLE工程目录…

Vue.js基础特性、生命周期及常用指令

目录 一、Vue构造选项 el根标签 data数据对象 methods定义方法 二、生命周期 三、常用指令 一、Vue构造选项 选项说明el唯一根标签,决定Vue实例会管理哪一个DOM节点dataVue实例对应的数据对象methods定义Vue实例的方法,可以在其他地方调用&#x…

慢SQL出现原因、优化、开启慢查询日志

文章目录慢SQL:出现原因:解决方式:开启慢查询日志:慢SQL: 出现原因: (1)数据库表索引设置不合理 (2)SQL语句有问题,需要优化 解决方式: (1&am…