05|Mysql锁分类

在这里插入图片描述

1. 锁分类

1.1根据性能

乐观锁

● 版本号
● 读多场景
● 第二次循环需要读取到最新的数据统计
示例

while{
// 1.调用方法获取当前版本号 getCurrentBalanceAndVersion(accountId); 	// 2.Java运算newBalance = Balance + 500;                updateAccountBalance(accountId, newBalance, version); //3.更新数据
} 
//如果当前version与需要的不一致,则重新获取并运算

悲观锁

  • 适合写多场景
  • RR隔离级别下更新操作是加悲观锁

1.2根据粒度

表锁

每次操作锁住整张表。开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低;一般用在整表数据迁移的场景

行锁

每次操作锁住一行数据。开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度最高。
InnoDB相对于MYISAM的最大不同有两点:
● InnoDB支持事务(TRANSACTION)
● InnoDB支持行级锁

注意,InnoDB的行锁实际上是针对索引加的锁(在索引对应的索引项上做标记),不是针对整个行记录加的锁。并且该索引不能失效,否则会从行锁升级为表锁。(RR级别会升级为表锁,RC级别不会升级为表锁)
RR和RC本质不同是:
RR通常都是快照读,需要关心过去时间的数据问题
RC是当前读,只需要查看最新的提交,不需要关心过去时刻的数据问题

RR隔离级别升级为表锁分析(无索引字段):

select * from account where name = 'zps' for update;   --where条件里的name字段无索引

● 其它Session对该表任意一行记录做修改操作都会被阻塞住
● 对表的所有更改操作包括修改和删除都会无法操作,因此当前已经升级为表锁。支持读取不支持修改

1.3 根据数据库的类型

读锁

针对同一份数据,多个读操作可以同时进行而不会互相影响

写锁

当前写操作没有完成前,它会阻断其他写锁和读锁,数据修改操作都会加写锁,查询也可以通过for update加写锁
在RR隔离级别下默认使用共享锁

1.4 意向锁

行锁标记表被占有
又称I锁,针对表锁,主要是为了提高加表锁的效率,是mysql数据库自己加的。当有事务给表的数据行加了共享锁或排他锁,同时会给表设置一个标识,代表已经有行锁了,其他事务要想对表加表锁时,就不必逐行判断有没有行锁可能跟表锁冲突了,直接读这个标识就可以确定自己该不该加表锁。特别是表中的记录很多时,逐行判断加表锁的方式效率很低。而这个标识就是意向锁。
意向锁主要分为
意向共享锁,IS锁,对整个表加共享锁之前,需要先获取到意向共享锁。
意向排他锁,IX锁,对整个表加排他锁之前,需要先获取到意向排他锁

2. 间隙锁

间隙锁,锁的就是两个值之间的空隙,间隙锁是在可重复读隔离级别下才会生效。Mysql默认级别是repeatable-read,有幻读问题,间隙锁是可以解决幻读问题的(被加锁的区间可以解决幻读)
假设三个间隙:id 为 (2,5),(5,10),(10,正无穷) 这三个区间,则锁住的间隙无法正常插入

注意:前提是查询的字段id是有索引的情况, 如果没有索引还是默认会锁表

3. 临建锁

行锁+间隙锁,解决边界问题

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

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

相关文章

【习题——菱形的打印】

一、打印下面的图形(菱形) 我们可以先来看一个简单点的菱形: 输入描述: 输入一个char类型字符 输出描述: 输出一个用这个字符填充的对角线长5个字符,倾斜放置的菱形: 1、思路: 我…

黑马c++ STL部分 笔记(3) deque容器

双端数组,可以对头端进行插入删除操作 deque与vector区别: vector对于头部的插入删除效率低,数据量越大,效率越低(每次头插,后面的元素就往后移) deque相对而言,对头部的插入删除速…

【论文综述+多模态】腾讯发布的多模态大语言模型(MM-LLM)综述(2024.02)

论文链接:24.02.MM-LLMs: Recent Advances in MultiModal Large Language | 国内-链接 实时网站:https://mm-llms.github.io 参考说明1-readpaper:https://mp.weixin.qq.com/s/ESUVe1aTYFLVJ10S9c1dBg 一、什么是MM-LLM ? 多模态大语言模型&#xff…

我写了个ImageWindow应用

文章目录 0 引言1 应用简介2 主要功能和特点2.1 多图像同/异步像素级对比2.2 支持多达30种图像格式2.3 高效率的图像处理性能 3 简明使用教程3.1 软件下载安装与更新3.1.1 软件下载与安装3.1.2 软件更新 3.2 多视窗添加并自动最优排列3.3 多样化图像导入方式3.4 自动切换显示模…

node 之 模块化

1.什么是模块化 模块化是指解决一个复杂问题时,自顶向下逐层把系统划分成若干模块的过程。对于整个系统来说,模块是可组合、分解和更换的单元。 编程领域中的模块化 编程领域中的模块化,就是遵守固定的规则,把一个大文件拆成独立并…

怎么调用文心一言的api接口生成一个简单的聊天机器人(python代码)

寒假在学习大模型,但也没弄出多少眉目,电脑性能还有点小问题,大模型总跑不起来,只会简单调用一下现有的大模型的接口,例如:文心一言,下面展示一下代码: import tkinter as tk impor…

Mysql安装教程

一、下载 点开下面的链接:https://dev.mysql.com/downloads/mysql/ 点击Download 就可以下载对应的安装包了, 安装包如下: 二、解压 下载完成后我们得到的是一个压缩包,将其解压,我们就可以得到MySQL 8.0.31 的软件本体了(就是一个文件夹…

第三节-docker-cs架构分析

一、组成 docker engine:docker-client、rest-api、dockerd containerd: 1、管理容器生命周期 2、拉取/推送镜像 3、存储管理 4、调用runc 5、管理网络 containerd-shim:相当于一个驱动,containerd通过containerd-shim驱使…

关于静态应用程序安全测试(SAST)的自动修复(AutoFix)

SAST(Static Application Security Testing,静态应用程序安全测试)具是一种在软件工程中使用的安全解决方案,它主要用于在程序员编写好源代码后,无需经过编译器编译,直接对源代码进行扫描,以找出…

MYSQL05高级_查看修改存储引擎、InnoDB和MyISAM对比、其他存储引擎介绍

文章目录 ①. 查看、修改存储引擎②. InnoDB和MyISAM对比③. Archive引擎 - 归档④. Blackhole引擎丢数据⑤. CSV - 引擎⑥. Memory引擎 - 内存表⑦. Federated引擎 - 访问远程表⑧. Merge引擎 - 管理多个MyISAM⑨. NDB引擎 - 集群专用 ①. 查看、修改存储引擎 ①. 查看mysql提…

Kotlin的各种骚气语法

1.奇怪的中括号? 前几星期在群里见群友问这种是什么鬼,kt中有这种语法吗? 但其实这种是重写的操作符,分别是重写了setter和getter,类似于list[0]1这样 上面的两个方法声明如下: 不过这种语法很容易引起歧义,所以除非很适合的情况下不建议重写 ps:更多的操作符重载参考最下…

uniapp 部署h5,pdf预览

1.hubuilderx 打包h5。 2.上传部署包到服务器。 解压部署包:unzip h5.zip 。 3.nginx配置。 user root; worker_processes 1; #worker_cpu_affinity 0001 0010 0100 1000; #error_log logs/error.log; #error_log logs/error.log notice; error_log /var/l…

【重温设计模式】桥接模式及其Java示例

【重温设计模式】桥接模式及其Java示例 桥接模式的介绍 今天我们要探讨的,正是一种名为“桥接模式”的设计模式。桥接模式,英文名Bridge Pattern,是一种结构型设计模式,它的主要目的是将抽象部分与实现部分分离,使得两…

Windows Docker 部署 Redis

部署 Redis 打开 Docker Desktop,切换到 Linux 内核。然后在 PowerShell 执行下面命令,即可启动一个 redis 服务 docker run -d --name redis -p 6379:6379 redis-如果需要自启动,加 --restart always 参数即可。 连接 Redis 使用客户端连…

python dictionary 字典

Python 字典 字典是另一种可变容器模型,且可存储任意类型对象。 字典的每个键值 key>value 对用冒号 : 分割,每个对之间用逗号(,)分割,整个字典包括在花括号 {} 中 ,格式如下 d {key1 : value1, key2 : value2, key3 : value3 }dict 作…

Vue依赖注入之Provide/Inject

1. 使用<script setup> 父组件 <template><div>这里是父组件的message值:{{ message }}</div><br /><div>这里是父组件的count值:{{ count }}</div><br /><classtest /> </template> <script setup> impor…

SpringBoot项目中如何结合Mybatis进行数据库查询

在Spring Boot项目中使用Mybatis进行数据库操作是一种常见的实现方式。下面我将展示如何在Spring Boot项目中整合Mybatis。这个示例将包括几个主要部分&#xff1a;项目依赖配置、配置文件、实体类、Mapper接口及其XML配置文件、服务类、以及一个简单的控制器。 1. 项目依赖配…

Linux Centos7配置SSH免密登录

Linux Centos7配置SSH免密登录 配置SSH免密登录说明&#xff1a; 分两步 第一步、给Server A生成密钥对 第二步、给Server B授权 生成密钥对之后&#xff0c;我们可以看看它保存的目录下的文件。 接下来我们就要把Server A&#xff08;10.1.1.74&#xff09;的公钥拷贝到Se…

AI新秀Mistral:“Open AI“ 新时代

最近互联网出现不少类似“下一代openai”、“GPT-4最强竞品”、“法国AI独角兽”、“欧洲的OpenAI”、“微软新宠儿”.... 的文章&#xff0c;都会附带一张图片&#xff0c;就是下面这张&#xff1a; 那么到底发生了什么&#xff0c;出来个什么东西呢&#xff1f;就是本文的主…

跟着cherno手搓游戏引擎【28】第一个游戏!源码解读!逐行注释!

源码解读&#xff1a; GameLayer层级&#xff1a;在构造函数中&#xff1a;创建窗口和相机&#xff0c;对随机数种子初始化&#xff1b; 在OnAttach方法中&#xff1a;初始化关卡&#xff1a;加载资源初始化地图信息&#xff1b;设置字体&#xff1b; 在OnUpdate方法中&…