数据库中常用的锁
目录
1、数据库中常用的锁类型
2、常见的数据库
3、以MySQL为例
3.1 MySQL的事务
3.2 MySQL事务的四大特性
1. 原子性(Atomicity)
2. 一致性(Consistency)
3. 隔离性(Isolation)
⭐mysql中的事务隔离级别
脏读、不可重复读和幻读
⭐mysql针对幻读的解决方案
4. 持久性(Durability)
1、数据库中常用的锁类型
在数据库中,常用的锁有以下几种类型:
1. 共享锁(Shared Lock):也称为读锁。多个事务可以同时持有共享锁,并且彼此之间不会相互阻塞。共享锁适用于读取操作,多个事务可以同时读取同一个数据,保证数据的一致性,但不允许其他事务对该数据进行修改。
2. 排他锁(Exclusive Lock):也称为写锁。排他锁只允许一个事务持有,其他事务无法同时持有排他锁。排他锁适用于写入和修改操作,当一个事务持有排他锁时,其他事务无法读取或修改相同的数据,确保数据的完整性。
3. 行级锁(Row-Level Lock):行级锁是在数据库表的行级别上进行加锁,只锁定需要操作的行,而不是整个表。行级锁可以更细粒度地控制并发访问,提高并发性能。常见的行级锁有行共享锁和行排他锁。
4. 间隙锁(Gap Lock):间隙锁用于防止幻读(Phantom Read)问题的发生。幻读是指在一个事务中,前后两次查询同一个范围的数据时,中间可能有其他事务插入了新的数据,导致两次查询的结果不一致。间隙锁会锁定一个范围,包括范围内的数据和范围之间的间隙,阻止其他事务在该范围内插入新的数据。
5. 自旋锁(Spin Lock):自旋锁是基于乐观锁的一种实现方式,它采用忙等待的方式,不断尝试获取锁,而不是将线程挂起。自旋锁适用于短时间内竞争激烈的情况,可以减少线程切换带来的开销。
6. 悲观锁(Pessimistic Lock):悲观锁认为并发访问会导致冲突,所以在访问数据之前就对其进行加锁。悲观锁适用于长时间占用资源或者数据冲突较多的场景,但在高并发环境下可能会导致性能问题。
7. 乐观锁(Optimistic Lock):乐观锁认为并发访问不会导致冲突,只在提交更新时检查是否有其他事务修改了数据。如果有冲突,则回滚当前事务并重试。乐观锁适用于并发冲突较少的场景,可以提高并发性能。
需要根据实际场景和需求选择合适的锁机制,并结合数据库事务来保证数据的一致性和并发性。
2、常见的数据库
除了 MySQL,还有一些其他常见的数据库系统,包括:
1. Oracle Database:由 Oracle 公司开发的关系型数据库管理系统(RDBMS)。它是市场上最为流行和强大的商业数据库之一,适用于大规模企业级应用。
2. Microsoft SQL Server:由 Microsoft 公司开发的关系型数据库管理系统。它广泛应用于 Windows 环境下的企业级应用,提供了丰富的功能和工具支持。
3. PostgreSQL:一个开源的关系型数据库管理系统,以其可靠性、扩展性和兼容性而闻名。它支持复杂的数据类型、高级查询和事务处理,并有着活跃的社区支持。
4. MongoDB:一个面向文档的 NoSQL 数据库系统,以其灵活的数据模型和可扩展性而受到青睐。它支持动态模式和分布式架构,适用于大数据存储和处理。
5. Redis:一个开源的内存数据库,以其高性能的键值存储和丰富的数据结构支持而著名。Redis 可用作缓存、消息队列、会话存储等多种用途。
6. SQLite:一个嵌入式关系型数据库引擎,非常轻量级且易于使用。它适用于移动设备和小型应用程序,不需要独立的服务器进程。
7. IBM Db2:由 IBM 公司开发的关系型数据库管理系统,适用于大型企业级应用。它提供了高可用性、安全性和扩展性等特性。
这些是其中一些常见的数据库系统,每个数据库都有自己的特点和适用场景。选择适合自己需求的数据库,可以根据项目规模、性能要求、数据模型等方面进行评估和比较。
3、以MySQL为例
3.1 MySQL的事务
在 MySQL 中,事务表示一组数据库操作,这些操作要么全部成功执行,要么全部失败回滚。事务的概念是为了维护数据的一致性和完整性。当一系列操作需要作为一个不可分割的单元执行时,就可以使用事务来确保这一系列操作要么全部成功提交,要么全部失败回滚。
在 MySQL 中,使用以下语句来定义一个事务:
START TRANSACTION; -- 开始事务
-- SQL 操作语句
COMMIT; -- 提交事务
-- 或 ROLLBACK; -- 回滚事务
在上述示例中,START TRANSACTION
用于开始一个事务,后续的 SQL 操作语句都属于这个事务。如果所有操作都成功完成,可以使用 COMMIT
提交事务;如果出现错误或者需要撤销操作,可以使用 ROLLBACK
回滚事务。
举个例子,假设我们有一个银行账户表,其中包含了用户的存款余额。我们需要进行转账操作,从一个账户向另一个账户转移一定金额,而这个转账操作需要保证原子性,即要么成功转账,要么不转账。这就是典型的事务应用场景。
START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE account_id = 12345; -- 从账户12345中扣除100元
UPDATE accounts SET balance = balance + 100 WHERE account_id = 67890; -- 向账户67890中增加100元
COMMIT; -- 提交事务
在这个例子中,两个更新操作被组合在一个事务中,要么两个更新操作都执行成功,要么都不执行。如果在执行过程中出现任何错误,可以使用 ROLLBACK
回滚事务,以确保数据的完整性和一致性。
通过事务,可以确保一组关联的数据库操作要么全部成功执行,要么全部不执行,从而保证了数据的完整性和一致性。
3.2 MySQL事务的四大特性
MySQL事务具有ACID四大特性,即:
1. 原子性(Atomicity)
事务被视为一个不可分割的原子操作单元,要么全部执行成功,要么全部回滚。如果事务中的任何一部分操作失败,那么整个事务将被回滚到初始状态,不会留下部分执行的结果。
2. 一致性(Consistency)
事务在执行之前和执行之后,数据库的完整性约束没有被破坏。这意味着事务必须将数据库从一个一致状态转移到另一个一致状态,保持数据的合法性和一致性。
3. 隔离性(Isolation)
事务的执行是相互隔离的,即一个事务的执行不应该对其他并发事务产生影响。每个事务都应该感觉到它是在独立运行的,不受其他事务的干扰。这可以防止并发事务产生的问题,如脏读、不可重复读和幻读。
⭐mysql中的事务隔离级别
在 MySQL 中,定义了多个事务隔离级别,用于控制并发事务的隔离程度。MySQL 支持以下四种标准的事务隔离级别:
读未提交(Read Uncommitted):事务中的修改即使未提交,其他事务也可以读取到这些未提交的数据。这种隔离级别存在脏读、不可重复读和幻读的问题。
读已提交(Read Committed):只能读取到已经提交的数据,未提交的数据对其他事务是不可见的。这种隔离级别可以避免脏读,但仍可能出现不可重复读和幻读。
可重复读(Repeatable Read)——默认:保证在同一个事务中多次读取相同记录的结果是一致的。其他事务对于同一条记录的修改在当前事务中是不可见的,可以避免脏读和不可重复读,但仍可能出现幻读。
可串行化(Serializable):最高的隔离级别,通过强制事务串行执行来避免不可重复读和幻读。在这个级别下,所有事务按顺序执行,可以避免所有类型的并发问题,但会降低并发性能。
可以通过以下语句设置事务的隔离级别:
SET TRANSACTION ISOLATION LEVEL <isolation_level>;
SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
其中 <isolation_level>
可以是 READ UNCOMMITTED
、READ COMMITTED
、REPEATABLE READ
或 SERIALIZABLE
。
选择合适的事务隔离级别需要根据具体的业务需求和并发访问情况进行权衡,以确保既能保证数据的一致性,又能提供良好的并发性能。
脏读、不可重复读和幻读
脏读、不可重复读和幻读是数据库中常见的并发问题。
脏读:脏读是指一个事务读取到了另一个事务未提交的数据。例如,事务A修改了一条记录,但还没有提交,此时事务B读取了这条记录,得到了被修改后的结果,但随后事务A回滚了操作,导致事务B读取到的数据实际上是无效的。脏读会导致数据的不一致性,因此需要避免。
不可重复读:不可重复读是指一个事务在两次读取同一条记录期间,另一个事务修改了该记录,导致前一个事务读取到的数据不一致。例如,事务A读取了一条记录,然后事务B修改了该记录并提交了,此时事务A再次读取同一条记录,得到的结果和之前不同。不可重复读会导致数据的不一致性,也需要避免。
幻读:幻读是指一个事务在两次查询同一范围内的记录期间,另一个事务插入了符合条件的记录,导致前一个事务得到的结果集不一致。例如,事务A查询某个表中所有age大于等于18的记录,得到结果集S1,但在事务A执行完毕后,事务B插入了一条age为20的记录,此时事务A再次查询同一范围内的记录,得到的结果集S2和S1不同。幻读会导致数据的不一致性,同样需要避免。
⭐mysql针对幻读的解决方案
MySQL 中针对幻读问题的解决方案是使用锁或多版本并发控制(MVCC)。
1. 锁:通过加锁来保证事务的隔离性和一致性。在可重复读隔离级别下,MySQL 使用行级锁来避免幻读。当一个事务在读取数据时,会在读取的记录上设置共享锁(S锁),其他事务可以同时读取该记录,但不能修改。当一个事务要修改数据时,会在修改的记录上设置排他锁(X锁),其他事务无法读取或修改该记录,直到持有锁的事务提交或回滚。
next-key 锁包含两部分:记录锁(行锁)、间隙锁。
记录锁是加在索引上的锁,间隙锁是加在索引之间的。
原理:将当前数据行与上一条数据和下一条数据之间的间隙锁定,保证此范围内读取的数据是一致的。
2. 多版本并发控制(MVCC):MVCC 是一种基于时间戳的并发控制机制。每个事务在执行时都有一个唯一的时间戳,读操作只能读取早于当前事务时间戳的数据版本,写操作则创建新的数据版本,并将其时间戳设为当前事务时间戳。这样可以实现读操作不受写操作的影响,从而避免幻读的问题。
即:每一行中都冗余了两个字段。一个是行的创建版本,一个是行的删除(过期)版本。版本号随着每次事务的开启自增。事务每次取数据的时候都会取创建版本小于当前事务版本的数据,以及过期版本大于当前版本的数据。
在 MySQL 中,InnoDB 存储引擎默认使用 MVCC 来解决幻读问题。它通过使用 Undo 日志记录旧版本数据和 Redo 日志记录新版本数据来实现。在可重复读隔离级别下,InnoDB 会在每个事务开始时为其分配一个唯一的事务 ID,读操作会根据事务 ID 和数据行的版本号来判断是否可见。
需要注意的是,使用 MVCC 解决幻读问题只适用于某些场景,例如在可重复读隔离级别下,通过索引范围扫描查询数据时可以避免幻读。但对于使用了间隙锁的情况或者涉及到大量插入和删除的场景,MVCC 并不能完全解决幻读问题,可能需要结合其他方法来处理。
4. 持久性(Durability)
一旦事务提交成功,其所做的修改将永久保存在数据库中,即使系统发生故障也不会丢失。数据库系统通过将事务日志持久化到磁盘上来实现持久性,以便在系统崩溃后可以进行恢复。
这些特性确保了事务的可靠性和一致性,使得在并发环境下多个事务可以安全地进行操作。在应用程序中,使用事务可以确保一系列数据库操作的完整性,以及对数据的正确处理和管理。
参考
数据库锁全集-CSDN博客
MySQL中都有哪些锁? - 知乎
MySQL :: MySQL 8.0 Reference Manual :: 15.7.1 InnoDB Locking
MySQL常见的七种锁详细介绍_51CTO博客_mysql锁表和解锁语句
MySQL锁篇 - 知乎
常见锁类型及其在数据库中的应用 (锁类型 数据库)-数据运维技术
相关文章:

数据库中常用的锁
目录 1、数据库中常用的锁类型 2、常见的数据库 3、以MySQL为例 3.1 MySQL的事务 3.2 MySQL事务的四大特性 1. 原子性(Atomicity) 2. 一致性(Consistency) 3. 隔离性(Isolation) ⭐mysql中的事务隔…...

关于对向量检索研究的一些学习资料整理
官方学习资料 主要是的学习资料是, 官方文档 和官方博客。相关文章还是挺多 挺不错的 他们更新也比较及时。有最新的东西 都会更新出来。es scdn官方博客 这里简单列一些,还有一些其他的,大家自己感兴趣去看。 什么是向量数据库 Elasticse…...

软件开发流程分析
软件开发流程分析 相关概念1 原型设计2 产品设计3 交互设计4 代码实现详细步骤 相关概念 前端:自研API,调用第三放API 后端:自研API,第三方API 数据库:Mysql,数据采集,数据迁移 服务器…...

017 OpenCV 向量机SVM
目录 一、环境 二、SVM原理 三、完整代码 一、环境 本文使用环境为: Windows10Python 3.9.17opencv-python 4.8.0.74 二、SVM原理 OpenCV中的向量机(SVM)是一种监督学习算法,用于分类和回归分析。它通过找到一个最优的超平…...

Qt练习题
1.使用手动连接,将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中,在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中,在槽函数中判断ui界面上输入的账号是否为"admin",密码是否…...

文本转图像 学习笔记
VQGAN (Vector Quantized Generative Adversarial Network) 是一种基于 GAN 的生成模型,可以将图像或文本转换为高质量的图像。 VQ (Vector Quantization)是一种数据压缩技术,是指将连续数据表示为离散化的向量。输入的图像或文本…...

开源CDN软件GoEdge —— 筑梦之路
官方网站:GoEdge CDN - 制作自己的CDN - GoEdge CDN | 自建CDN GoEdge是一款管理分布式CDN边缘节点的开源工具软件,目的是让用户轻松地、低成本地创建CDN/WAF等应用。 特性 免费 - 开源、免费、自由、开放 简单 - 架构简单清晰,安装简单&a…...

基于SpringBoot+Vue会员制医疗预约服务管理信息系统(Java毕业设计)
点击咨询源码 大家好,我是DeBug,很高兴你能来阅读!作为一名热爱编程的程序员,我希望通过这些教学笔记与大家分享我的编程经验和知识。在这里,我将会结合实际项目经验,分享编程技巧、最佳实践以及解决问题的…...

【Linux | 编程实践】防火墙 (网络无法访问)解决方案 Vim常用快捷键命令
🤵♂️ 个人主页: AI_magician 📡主页地址: 作者简介:CSDN内容合伙人,全栈领域优质创作者。 👨💻景愿:旨在于能和更多的热爱计算机的伙伴一起成长!!&…...

仅 CSS 阅读进度条
为了构建一个阅读进度条,即显示用户向下滚动时阅读文章的进度,很难不考虑 JavaScript。但是,事实证明,您也可以使用纯 CSS 构建阅读进度条。 从本质上讲,一个名为 animation-timeline 的新实验性 CSS 属性可以让你指定…...

深度剖析中国居民消费价格指数CPI数据可视化案例-Python可视化技术实现(附完整源码)【数据可视化项目案例-16】
🎉🎊🎉 你的技术旅程将在这里启航! 🚀🚀 本专栏包括所有的可视化技术学习,感兴趣可以到本专栏页面,查阅可视化宝典可快速了解本专栏。订阅专栏用户可以在每篇文章底部下载对应案例源码以供大家深入的学习研究。 🎓 每一个案例都会提供完整代码和详细的讲解,不论…...

SpringBoot——嵌入式 Servlet容器
一、如何定制和修改Servlet容器的相关配置 前言: SpringBoot在Web环境下,默认使用的是Tomact作为嵌入式的Servlet容器; 【1】修改和server相关的配置(ServerProperties实现了EmbeddedServletContainerCustomizer)例如…...

王炸升级!PartyRock 10分钟构建 AI 应用
前言 一年一度的亚马逊云科技的 re:Invent 可谓是全球云计算、科技圈的狂欢,每次都能带来一些最前沿的方向标,这次也不例外。在看完一些 keynote 和介绍之后,我也去亲自体验了一些最近发布的内容。其中让我感受最深刻的无疑是 PartyRock 了。…...

文件管理和操作工具Path Finder mac功能介绍
Path Finder mac是一款Mac平台上的文件管理和操作工具,提供了比Finder更丰富的功能和更直观的用户界面。它可以帮助用户更高效地浏览、复制、移动、删除和管理文件,以及进行各种高级操作。 Path Finder mac软件功能 - 文件浏览:可以快速浏览文…...

转换 pytorch 格式模型为 caffe格式模型 pth2caffemodel
基于 GitHub xxradon/PytorchToCaffe 源码,修改 example\resnet_pytorch_2_caffe.py 如下 import os import sys sys.path.insert(0, .)import torch from torch.autograd import Variable from torchvision.models import resnet import pytorch_to_caffe"&q…...

【S32DS RTD实战】-1.3-S32K3工程生成S19,BIN,Hex文件,以及Post-build steps的妙用
目录 1 方法一:逐个生成Motorola S-record(s19,srec…),Intel HEX,Bin文件 1.1 生成Motorola S-record(s19,srec…)文件 1.2 生成Intel HEX文件 1.3 生成Bin文件 2 …...

Java工程找不到javax.xml.bind.annotation包
文章目录 问题解决方法参考 问题 最近Java工程找不到javax.xml.bind.annotation包,进行了解决。 解决方法 参考 stackoverflow: package javax.xml.bind.annotation does not exist error javax.xml.bind这个库从Java 11版本就被移除了,缺失了这个包…...

【C语言】网络字节序和主机字节序
网络字节序和主机字节序是计算机中字节的两种排序方式,它们主要用于解决不同计算机之间数据通信的问题。 一、网络字节序 也被称为大端字节序,是一种标准的字节序。在网络通信中,如果两台主机的字节序不同,可能会导致数据解释的二…...

极简模式,助力宏观数据监控
随着UWA GOT Online采样的参数越来越多样化,为了提升开发者的使用体验,我们最新推出了三种预设数据采集方案:极简模式、CPU模式、内存模式。该更新旨在降低多数据采集对数据准确性的干扰,同时也为大家提供更精准且有针对性的数据指…...

智能优化算法应用:基于花授粉算法3D无线传感器网络(WSN)覆盖优化 - 附代码
智能优化算法应用:基于花授粉算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于花授粉算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.花授粉算法4.实验参数设定5.算法结果6.参考文…...

IT圈的“鄙视链”大揭秘:从Java到Go,编程语言之战!
目录 编辑 Java程序员: 自信满满的领头羊 C语言程序员: 严肃的技术守护者 汇编语言程序员: 古老的传承者 Go语言程序员: 新晋的潜力股 结语: 编程语言,相互鄙视中求共存 我的其他博客 在IT圈…...

【C++】算法库(复制操作、交换操作、变换操作)
C算法库 文章目录 C算法库复制操作copy , copy_ifcopy_ncopy_backward 交换操作swapswap_rangesiter_swap 变换操作transformreplacereplace_copy replace_copy_if 算法库提供大量用途的函数(例如查找、排序、计数、操作),它们在元素范围上操…...

CV计算机视觉每日开源代码Paper with code速览-2023.12.6
点击计算机视觉,关注更多CV干货 论文已打包,点击进入—>下载界面 点击加入—>CV计算机视觉交流群 1.【基础网络架构:Transformer】Rejuvenating image-GPT as Strong Visual Representation Learners 论文地址:https://a…...

面试经典150题(1-2)
leetcode 150道题 计划花两个月时候刷完,今天完成了两道(1-2)150: (88. 合并两个有序数组)题目描述: 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 n…...

MySQL使用教程
数据构成了我们日益数字化的社会基础。想象一下,从移动应用和银行系统到搜索引擎,再到如 ChatGPT 这样的先进人工智能聊天机器人,这些工具若没有数据支撑,将寸步难行。你有没有好奇过这些海量数据都存放在哪里呢?答案正…...

微服务学习:Ribbon实现客户端负载均衡,将请求分发到多个服务提供者
Ribbon是Netflix开源的一个基于HTTP和TCP客户端负载均衡器。它主要用于在微服务架构中实现客户端负载均衡,将请求分发到多个服务提供者上,从而实现高可用性和扩展性。 Ribbon的主要特点包括: 客户端负载均衡:Ribbon是一个客户端负…...

孩子还是有一颗网安梦——Bandit通关教程:Level0
🕵️♂️ 专栏《解密游戏-Bandit》 🌐 游戏官网: Bandit游戏 🎮 游戏简介: Bandit游戏专为网络安全初学者设计,通过一系列级别挑战玩家,从Level0开始,逐步学习基础命令行和安全概念…...

读excel文件,借助openpyxl工具
读excel文件,借助openpyxl工具 import osimport requestsos.environ["http_proxy"] "http://127.0.0.1:7890" os.environ["https_proxy"] "http://127.0.0.1:7890"base_url "https://testnet.starscan.io/explore…...

ubuntu16.04升级openssl
Ubuntu16.04 默认带的openssl版本为1.0.2 查看:openssl version 1.下载openssl wget https://www.openssl.org/source/openssl-1.1.1.tar.gz 编译安装 tar xvf openssl-1.1.1.tar.gz cd openssl-1.1.1 ./config make sudo make install sudo ldconfig 删除旧版本 su…...

【力扣100】56.合并区间
添加链接描述 class Solution:def merge(self, intervals: List[List[int]]) -> List[List[int]]:# 队列,每次加进来两个元素:1.不包含:第一个元素出去,并放入result;2.包含:合并nlen(intervals)result…...