MYSQL 锁机制 与 MVCC多版本并发

MYSQL锁机制与优化以及MVCC底层原理

锁分类

乐观锁,悲观锁

从性能上分为乐观锁版本对比,版本一致就更新,不一致就不更新或CAS机制)和悲观锁(锁住资源等待),乐观锁适合读比较多的场景,悲观锁适合写比较多的场景;如果在写操作比较多的场景,用乐观锁会导致对比次数过多,影响性能,因为每次查询到的版本号,和更新时的版本号就很容易不一致,就会cpu空转;

表锁,页锁,行锁

从数据操作的粒度上来说,分为表锁,页锁,行锁;

表锁每次锁住一张表,开销小,因为在表层面直接添加锁标记,不用一条一条查找记录,锁粒度大,发生锁冲突概率高,并发度低,一般在整张表数据迁移的时候,才会用;

手动增加表锁

Lock table 表名称 read(或者write);

查看表上加过的锁

Show opentables;

删除表锁

Unlock tables;

行锁的锁粒度小,但是因为它需要进行数据查找,所以开销相对表锁大,行锁其实不是添加到哪一行数据上的,它是添加到它的索引上的,如果我们添加锁时,条件字段没有索引,那么就可能锁整张表(RR会升级为表锁,RC不会);

关于RR级别行锁升级为表锁的原因

因为在RR的隔离级别下,需要解决不可重复读和幻读的问题,如果没有通过索引加锁,那么就会遍历所有的聚簇索引时,都会添加锁,为了防止扫描过的索引被其它事务修改,或间隙(主键为整数1,3之间的间隙就是2)被其它事务插入(幻读),从而导致数据不一致,所以它是把所有的索引记录和间隙都锁上;

页锁只有BDB的存储引擎才支持,页锁就是锁定的资源比行锁要多;页锁介于行锁和表锁之间;有点类似分段锁;

读锁,写锁,意向锁

从数据的操作类型上分为读锁和写锁;

读锁(共享锁)

针对同一数据,多个事务中的读操作可以同时进行,不会相互影响;

写锁

当前操作没有玩,其它的读锁和写锁都会被阻塞;数据的修改(insert,update,delete)操作都会添加写锁,查询也可以通过

Select * from table1 where id=1 for update;

来添加写锁;

意向锁

主要是为了提升增加表锁的效率,比如A表中又一行数据添加了行锁,但是这时另一个事务要添加表锁,正常情况下,添加表锁前要去遍历所有数据判断,是否存在行锁,但是为了效率,只要添加了行锁,这这张表添加一个标识,表示A表已经有行锁了,这样它就可以直接判断到底能不能加锁了;

间隙锁,临键锁

间隙锁本质是一个写锁,但它锁的不是索引值,而是两个索引值之间的空隙范围,间隙锁是一个开区间,只要锁了间隙内的一条数据,那么它就会锁住整个间隙,也就是范围锁;在可重复读级别才会生效,它主要就是用来解决幻读

比如表中数据

我现在锁住一个间隙,

Select * from account where id =15 for update; id=15的数据添加写锁

但是这时我添加10,20之间的任意一条数据都不行会被锁住,当然10和20可以操作;这就是间隙锁;

幻读就是A事务读取到了B事务在间隙中新插入的数据,这个时候我们只要在间隙区间添加一个间隙锁,让它在这个区间不能插入,就能解决幻读的问题;

临键锁

间隙锁和行锁的结合,就是把间隙锁的开区间变成闭区间,这里就是3到10的区间有锁,然后10这行真实存在的数据也有锁;

锁等待分析

查看当前锁等待的情况

Show status like ‘innodb_row_lock%‘ ch

查看库中当前所有的具体锁等待,事务,锁

查看事务

Select * from INFOMATION_SCHEMA.INNODB_TRX;

查看锁

Select * from INFOMATION_SCHEMA.INNODB_LOCKS;

查看锁等待

Select * from INFOMATION_SCHEMA.INNODB_LOCK_WAITS;

释放锁,trx_mysql_thread_id可以从INNODB_TRX表里查看到;

Kill trx_mysql_thread_id;

查看锁等待详细信息(锁日志)这个排查生产问题很重要

Show engine innodb status;

锁优化实践

RR级别隔离级别,不通过索引来加锁,会升级为表锁;

MVCC多版本并发控制机制 1:52:45

Undo日志版本链,

在并发的情况下,或者说多个事务都在修改同一条数据的时候,会生成日志版本链,它是为了数据进行回滚的,当所有事务都完成提交后,关于当前数据的日志版本链就是被删除;新增的数据版本链会马上删除,当同时有修改进来,新增的操作不提交,就没有数据进行修改,所以在新增提交后,修改的会新生成日志版本链,;

RR隔离级别,

为了能解决不可重复读的情况,它在第一次读取数据时,会记录当前已存在事务的状态,如果当前为已提交,则可读,当前为未提交则不可读,根据它的undo日志链一层一层找,直到找到这条数据此时已经提交的那条日志记录;

具体可见性算法逻辑如下

针对某一行数据的事务,

最小活跃事务ID:当前还没有提交的最小事务ID

最大事务id+1:关于当前数据,未来要开启的新事务

活跃事务id列表:当前数据,版本链上事务还没有提交的事务

1.小于最小活跃事务ID,小于肯定就是已经提交了,可见

2,如果数据行的事务id>=Read View中记录的当前出现的最大事务id+1,则跳转步骤5执行。

3,事务id列表为空,则该行数据可见,也就是当前查询的数据行没有事务。

4,如果数据行的事务id大于等于Read View(一致性视图)最小事务id,并且

小于Read View中记录的当前出现的最大事务id+1。

判断若存在于活跃事务id列表,则不可见。

判断若不存在于活跃事务id列表,则可见。

5,根据回滚指针在undo log中取出一条记录,从1步骤重复判断,直到找到满足条件的记录,否则返回空。

RC隔离级别

它与RR隔离级别不同的是,RR隔离级别第一次查询后,生成的read view就不会变了,而RC则会在每一次查询的时候,重新生成read view;

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

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

相关文章

无监督学习简介

无监督学习简介 一、定义和核心概念 无监督学习的定义 无监督学习是机器学习的一个关键分支,它涉及到从未标注数据中学习和提取信息。不同于其他学习类型,无监督学习的数据集没有提供任何显式的输出标签或结果。因此,这种学习方法的主要任务…

运放知识点总结

目录 一、运放基础知识 (operational amplifier) 1.由来 2.用途 3.符号 4.内部结构​编辑 5.虚短虚断 二、同相放大电路 (Non-inverting Amplifier) 三、反相放大电路 (Inverting Amplifier) 四、差分放大电路 (Difference Amplifier) 五、加法…

如何使用CSS构建一个瀑布流布局

如何使用CSS构建一个瀑布流布局 瀑布流布局是一种常见的网页布局方式,其中元素以不同的大小排列,且行与列之间没有不均匀的间隙。在瀑布流布局中,即使某一行或列中的元素较短,下一个元素也会占据空间。 如何实现瀑布流布局 实现…

MacOS Docker 可视化面板 Portainer

一、简介 Portainer 是一个可视化的容器镜像图形管理工具,使用 Portainer 可以轻松构建、管理和维护Docker 环境。 而且完全免费(portainer-ce 是免费的,portainer-ee 是需要授权的,今天安装的是 portainer-ce 版本)&…

Chatgpt掘金之旅—有爱AI商业实战篇|社交媒体管理|(七)

演示站点: https://ai.uaai.cn 对话模块 官方论坛: www.jingyuai.com 京娱AI 一、AI技术社交媒体创业有哪些机会? 人工智能(AI)技术作为当今科技创新的前沿领域,为创业者提供了广阔的机会和挑战。随着AI技…

如何注册midjourney账号

注册Midjourney账号比较简单,准备好上网工具,进入官网 Midjourney访问地址: https://www.midjourney.com/ 目前没有免费使用额度了,会员最低 10 美元/月,一般建议使用30美元/月的订阅方案。了解如何订阅可以查看订阅…

设计模式——组合模式08

组合模式:把类似对象或方法组合成结构为树状的设计思路。 例如部门之间的关系。 设计模式,一定要敲代码理解 抽象组件 /*** author ggbond* date 2024年04月06日 08:54* 部门有:二级部门(下面管三级部门) 三级部门 &a…

马林思维个人总结--情绪模型/方法论

马林思维一些观点总结,出于个人归纳,认为对自己有用的就整理起来。持续更新中。 文章目录 一、价值点1: 情绪-思维-行为 模型---情绪为王,这个世界是非理性的1. 情绪才是最本质的东西, 情绪决定思维,思维决…

【Canvas与艺术】绘制灰色橄榄枝环绕“Premium Quality”徽章

【关键点】 利用复数计算出树叶的控制点&#xff0c;用二次贝塞尔曲线勾画树叶。 【成果图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head&…

海外语言任务商城源码 海外仓库系统及商城系统

海外语言任务商城源码 海外仓库系统及商城系统 自带利息宝理财活动文本搭建教程 搭建简单&#xff0c;前台是单语言的。 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/89013345 更多资源下载&#xff1a;关注我。

【.Net】DotNetty

文章目录 概述NIO和BIO、AIODotNetty适用场景DotNetty的整体架构和模块DotNetty的使用示例来源 概述 本系列文章主要讲述由微软Azure团队研发的.net的版本的netty&#xff0c;Dotnetty。所有的开发都将基于.net core 3.1版本进行开发。 Dotnetty是什么&#xff0c;原本Netty是…

wordpress全站开发指南-面向开发者及深度用户(全中文实操)--wordpress中的著名循环

wordpress中的著名循环 首先&#xff0c;在深入研究任何代码之前&#xff0c;我们首先要确保我们有不止一篇博客文章可以工作。因此&#xff0c;我们要去自己的wordpress站点&#xff0c;从侧边栏单机Posts(文章)&#xff0c;进行创建 在执行代码的时候会优先执行single.php如…

第四百四十二回 再谈flutter_launcher_icons包

文章目录 1. 概念介绍2. 使用方法3. 示例代码4. 经验与总结4.1 经验分享4.2 内容总结 我们在上一章回中介绍了"overlay_tooltip简介"相关的内容&#xff0c;本章回中将 再谈flutter_launcher_icons包.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 …

sqlmap(四)案例

一、注入DB2 http://124.70.71.251:49431/new_list.php?id1 这是墨者学院里的靶机&#xff0c;地址&#xff1a;https://www.mozhe.cn/ 1.1 测试数据库类型 python sqlmap.py -u "http://124.70.71.251:49431/new_list.php?id1" 1.2 测试用户权限类型 查询选…

WCH恒沁单片机-CH32V307学习记录2----FreeRTOS移植

RISC-V 单片机 FreeRTOS 移植 前面用了 5 篇博客详细介绍了 FreeRTOS 在 ARM Cortex-M3 MCU 上是如何运行的。 FreeRTOS从代码层面进行原理分析系列 现在我直接用之前的 RISC-V MCU 开发板子&#xff08;CH32V307VCT6&#xff09;再次对 FreeRTOS 进行移植&#xff0c;其实也…

深度学习理论基础(六)Transformer多头注意力机制

目录 一、自定义多头注意力机制1. 缩放点积注意力&#xff08;Scaled Dot-Product Attention&#xff09;● 计算公式● 原理 2. 多头注意力机制框图● 具体代码 二、pytorch中的子注意力机制模块 深度学习中的注意力机制&#xff08;Attention Mechanism&#xff09;是一种模仿…

html骨架以及常见标签

推荐一个网站mdn。 html语法 双标签&#xff1a;<标签 属性"属性值">内容</标签> 属性&#xff1a;给标签提供附加信息。大多数属性以键值对的形式存在。如果属性名和属性值一样&#xff0c;可以致谢属性值。 单标签&#xff1a;<标签 属性"属…

【JavaWeb】Day33.MySQL概述

什么是数据库 数据库&#xff1a;英文为 DataBase&#xff0c;简称DB&#xff0c;它是存储和管理数据的仓库。 像我们日常访问的电商网站京东&#xff0c;企业内部的管理系统OA、ERP、CRM这类的系统&#xff0c;以及大家每天都会刷的头条、抖音类的app&#xff0c;那这些大家所…

Python | Leetcode Python题解之第13题罗马数字转整数

题目&#xff1a; 题解&#xff1a; class Solution:SYMBOL_VALUES {I: 1,V: 5,X: 10,L: 50,C: 100,D: 500,M: 1000,}def romanToInt(self, s: str) -> int:ans 0n len(s)for i, ch in enumerate(s):value Solution.SYMBOL_VALUES[ch]if i < n - 1 and value < S…

.NET8 和 Vue.js 的前后端分离

在.NET 8中实现前后端分离主要涉及到两个部分&#xff1a;后端API的开发和前端应用的开发。后端API通常使用ASP.NET Core来构建&#xff0c;而前端应用则可以使用任何前端框架或技术栈&#xff0c;比如Vue.js、React或Angular等。下面是一个简化的步骤指南&#xff0c;帮助你在…