22. 数据库的隔离级别和锁机制
文章目录
- 数据库的隔离级别和锁机制
- 一、数据库隔离级别
- 1. 隔离级别说明
- 2. 如何选择隔离级别
- 3. 查询当前客户端隔离级别的命令.
- 4. 修改隔离的命令
- 二、数据库中的锁
- 1. 共享锁、排他锁
- 2. 死锁
- 3. 行级锁、表级锁
- 三、解决更新丢失问题
- 1. 解决方案
- 2. 乐观锁、悲观锁
- 3. 乐观锁、悲观锁的选择
数据库的隔离级别和锁机制
一、数据库隔离级别
1. 隔离级别说明
隔离级别是基于客户端来讨论的,不同的客户端在和服务器交互式可以有不同的隔离级别,客户端处在什么隔离级别就具有什么隔离级别的问题。mysql数据库的隔离级别一共有四种.
标志 | 名称 | 说明 |
---|---|---|
read uncommitted | 读未提交 | 不做任何隔离。可能产生脏读,不可重复读,虚读/幻读问题性能最好。 |
read committed | 读已提交 | 一个事务可以读取到另一个事务已经提交的数据。可以防止脏读,但可能存在不可重复读,虚读/幻读问题,性能较好。 |
repeatable read | 可重复读取 | 在查询整表数据时,一个事务可以读取到另一个事务已经提交的数据。可以防止脏读不可重复读问题,但可能存在虚读/幻读问题。mysql默认采用此隔离级别。性能一般。 |
serializable | 序列化 | 通过锁进行严格隔离,对同一个数据的访问要串行化进行。可以防止脏读,不可重复读,虚读/幻读问题。但数据库处于串行化状态,效率极其低下。性能最差。 |
2. 如何选择隔离级别
1. 选择不同的隔离级别,就可以防止在并发读写的过程中的不同的隔离性问题,隔离级别设置的越严格,防止的问题就越多但性能就越低,隔离级别设置的越宽松,性能就越好但可能产生的隔离性问题就越多
2. 数据库使用者应该根据自己的需求选择一个合理的隔离级别,选择一个能够防止想要防止的问题的情况下性能尽量好的隔离级别。
3. 从可靠性角度:serializable > repeatable read -> read committed -> read uncommitted
4. 从性能角度:read uncommitted -> read committed -> repeatable read ->serializable
5. 在真正的开发中 脏读问题太严重,所以read uncommitted很少用。serializable性能太差,也很少用。所以只需根据是否需要防止不可重复读,在read committed 和repeatable read之间选择一个即可。在实际开发中 repeatable read用的跟多一些。
3. 查询当前客户端隔离级别的命令.
select @@tx isolation;
4. 修改隔离的命令
set[session/global] transaction isolation level 隔离级别名称;1. 可以通过选择[session]来指定修改的是当前客户端的隔离级别,mysql服务器默认的隔离级别不变。
2. 可以通过选择[global来指定修改的是mysl服务器默认的隔离级别,当前客户端隔离级别不变,默认不写就是[global)
二、数据库中的锁
1. 共享锁、排他锁
数据库也是用锁来保证数据隔离的,但是为了数据库的锁设计的更加精细。体现在数据库中的锁分为共享锁和排他锁
1. 共享锁和共享锁可以共存,共享锁和排他锁不能共存
2. 排他锁和任何锁都不能共存
3. 在非serializable隔离级别下,查询不加锁
4. 在Serializable隔离级别下,查询加共享锁。
5. 任意隔离级别下增删改加排他锁。
正是利用了这种锁机制,数据库保证了并发的读不隔离,并发的写一定隔离,并发的读写在某一方或多方为Serializable的级别时,实现串行化,保证完全可靠。
2. 死锁
多个客户端都是serializable的级别下,先查询再修改,可能会进入与相等待状态,其实就是发生了死锁,mysql会检测到死锁,自动退出一方以打断死锁。
3. 行级锁、表级锁
数据库的锁根据锁定的粒度可以分为行级锁和表级锁。行级锁锁一行。表级锁锁整表。数据库自动根据操作的数据决定加哪种粒度的
三、解决更新丢失问题
1. 解决方案
1. 修改隔离级别为Serializablea。将数据库的隔离级别设置为Serializable即可完全防止更新丢失问题但通常基于效率的考虑,数据库的隔离级别不会设置为Serializable.此时要选择其他的解决方案
2. 悲观锁、乐观锁。在非Serializable隔离级别下,可以使用悲观锁、乐观锁来解决更新丢失。悲观锁、乐观锁并不是数据库中真正存在的锁,仅仅是更新丢失问题解决方案的名字。这个名字体现了在解决更新丢失问题时的思考的角度。
2. 乐观锁、悲观锁
1. 悲观锁悲观的认为每次查询都会造成更新丢失,则在查询时手动加上排他锁,从而在查询阶段就避免同时查询,从而避免更新丢失。在select语句后加上for update就可以手动增加排他锁。
2. 乐观锁乐观的认为每次查询都不会造成更新丢失,每次都正常执行查询,但为了防止可能的更新丢失造成危害,通常都会在表中额外设计一个额外版本字段,每次更新时版本字段都自增,且每次更新操作中必须基于上一个版本才做更新从而避免更新丢失造成的危害。
3. 乐观锁、悲观锁的选择
1. 悲观锁的缺点是一查就锁,查询多是效率低下
2. 乐观锁的缺点是,在大量的并发修改时,很容易造成修改失败,极端的情况下可能需要失败很多次才能完成修改,
3. 查询较多,修改较少,用乐观锁
4. 修改较多,查询较少,用悲观锁
相关文章:
22. 数据库的隔离级别和锁机制
文章目录 数据库的隔离级别和锁机制一、数据库隔离级别1. 隔离级别说明2. 如何选择隔离级别3. 查询当前客户端隔离级别的命令.4. 修改隔离的命令 二、数据库中的锁1. 共享锁、排他锁2. 死锁3. 行级锁、表级锁 三、解决更新丢失问题1. 解决方案2. 乐观锁、悲观锁3. 乐观锁、悲观…...
【题解】[ABC312E] Tangency of Cuboids(adhoc)
【题解】[ABC312E] Tangency of Cuboids 少见的 at 评分 \(2000\) 的 ABC E 题,非常巧妙的一道题。 特别鸣谢:dbxxx 给我讲解了他的完整思路。 题目链接 ABC312E - Tangency of Cuboids 题意概述 给定三维空间中的 \(n\) 个长方体,每个长方体…...
k8s服务发现之使用 HostAliases 向 Pod /etc/hosts 文件添加条目
某些情况下,DNS 或者其他的域名解析方法可能不太适用,您需要配置 /etc/hosts 文件,在Linux下是比较容易做到的,在 Kubernetes 中,可以通过 Pod 定义中的 hostAliases 字段向 Pod 的 /etc/hosts 添加条目。 适用其他方…...

python中有哪些比较运算符
目录 python中有哪些比较运算符 使用比较运算符需要注意什么 总结 python中有哪些比较运算符 在Python中,有以下比较运算符可以用于比较两个值之间的关系: 1. 等于 ():检查两个值是否相等。 x y 2. 不等于 (!):检查两个…...
Python网络编程详解:Socket套接字的使用与开发
Python网络编程详解:Socket套接字的使用与开发 1. 引言 网络编程是现代应用开发中不可或缺的一部分。通过网络编程,我们可以实现不同设备之间的通信和数据交换,为用户提供更加丰富的服务和体验。Python作为一种简洁而强大的编程语言&#x…...

Appium+python自动化(二十六)- Toast提示(超详解)简介
开始今天的主题 - 获取toast提示 在日常使用App过程中,经常会看到App界面有一些弹窗提示(如下图所示)这些提示元素出现后等待3秒左右就会自动消失,这个和我日常生活中看到的烟花和昙花是多么的相似,那么我们该如何获取…...

SpringBoot自动装配介绍
SpringBoot是对Spring的一种扩展,其中比较重要的扩展功能就是自动装配:通过注解对常用的配置做默认配置,简化xml配置内容。本文会对Spring的自动配置的原理和部分源码进行解析,本文主要参考了Spring的官方文档。 自动装配的组件 …...

1400*D. Candy Box (easy version)(贪心)
3 10 9 Example input 3 8 1 4 8 4 5 6 3 8 16 2 1 3 3 4 3 4 4 1 3 2 2 2 4 1 1 9 2 2 4 4 4 7 7 7 7 output 题意: n个糖果,分为多个种类,要求尽可能的多选,并且使得不同种类的数量不能相同。 解析: 记录每种糖…...

设计模式-备忘录模式在Java中使用示例-象棋悔棋
场景 备忘录模式 备忘录模式提供了一种状态恢复的实现机制,使得用户可以方便地回到一个特定的历史步骤,当新的状态无效 或者存在问题时,可以使用暂时存储起来的备忘录将状态复原,当前很多软件都提供了撤销(Undo)操作࿰…...

用合成数据训练托盘检测模型【机器学习】
想象一下,你是一名机器人或机器学习 (ML) 工程师,负责开发一个模型来检测托盘,以便叉车可以操纵它们。 你熟悉传统的深度学习流程,已经整理了手动标注的数据集,并且已经训练了成功的模型。 推荐:用 NSDT设…...
人性-基本归因错误
定义 基本归因谬误指出,你评价别人的一个行为时,你会高估他的内部因素——比如性格的影响,低估外在的情景之类各种复杂因素的影响。 具体表现是对自己,我们很愿意分析复杂的原因;对别人,如果他一句话说的…...
游戏引擎:打造梦幻游戏世界的秘密武器
介绍 游戏引擎是游戏开发中不可或缺的工具,它为开发者提供了构建游戏世界所需的各种功能和工具。本文将介绍游戏引擎的概念、使用方法以及一个完整的游戏项目示例。 游戏引擎的概念 游戏引擎是一种软件框架,它提供了游戏开发所需的各种功能和工具&…...

ClickHouse(六):Clickhouse数据类型-1
进入正文前,感谢宝子们订阅专题、点赞、评论、收藏!关注IT贫道,获取高质量博客内容! 🏡个人主页:含各种IT体系技术,IT贫道_Apache Doris,Kerberos安全认证,大数据OLAP体系技术栈-CSDN博客 &…...

【Linux】网络基础
🍎作者:阿润菜菜 📖专栏:Linux系统网络编程 文章目录 一、协议初识和网络协议分层(TCP/IP四层模型)认识协议TCP/IP五层(或四层)模型 二、认识MAC地址和IP地址认识MAC地址认识IP地址认…...
小程序-接口概率性接收不到参数
在小程序上调用一个接口,传入筛选条件,但返回结果却没有进行筛选,概率性出现这种情况,频率较低。 然后在postman调用该接口,调用很多很多次,发现也出现这种问题,看了代码,接口的传参…...

合作客户销售数据可视化分析
以一个案例进行实际分析: 数据来源:【地区数据分析】 以此数据来制作报表。 技巧一:词云图 以城市名称来显示合同金额的分布,合同金额越大,则城市文字显示越大。 技巧二:饼图 下面制定一个,合…...
git仓库迁移场景
1.git仓库迁移 代码仓库从公网迁移内网,内外网网络不通,而且必须保证代码完整,包括分支以及提交记录。具体步骤如下 1.1 拉取所有分支镜像 1.2 现在本地电脑新建文件夹 mkdir newdir1.3 进入新建文件 newdir 执行下面命令拉取所有镜像代码…...
【RabbitMQ】之持久化机制
目录 一、RabbitMQ 持久化机制 1、RabbitMQ 持久化概述2、队列持久化3、消息持久化4、交换器持久化 二、RabbitMQ 知识扩展 1、内存告警与内存换页2、磁盘告警与配置3、数据写入磁盘时机4、磁盘消息格式5、磁盘文件删除机制 一、RabbitMQ 持久化机制 1、RabbitMQ 持久化概述…...

【项目6 UI Demo】前端代码记录
前端代码记录 1.GridListItem中的布局 在这个Item中的布局采用的是VBox和HBox相结合的方式。相关的代码如下: <VBox class"sapUiTinyMargin"><HBox justifyContent"SpaceBetween"><Titletext"{ToolNumber}"wrapping…...

【计算机网络】应用层协议 -- HTTP协议
文章目录 1. 认识HTTP协议2. 认识URL3. HTTP协议格式3.1 HTTP请求协议格式3.2 HTTP响应协议格式 4. HTTP的方法5. HTTP的状态码6. HTTP的Header7. Cookie和Session 1. 认识HTTP协议 协议。网络协议的简称,网络协议是通信计算机双方必须共同遵守的一组约定࿰…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...

地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...

label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...

12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...