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协议 协议。网络协议的简称,网络协议是通信计算机双方必须共同遵守的一组约定࿰…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...

docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...

Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...

如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...

(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...