数据库中常用的锁

目录

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 支持以下四种标准的事务隔离级别:

  1. 读未提交(Read Uncommitted):事务中的修改即使未提交,其他事务也可以读取到这些未提交的数据。这种隔离级别存在脏读、不可重复读和幻读的问题

  2. 读已提交(Read Committed):只能读取到已经提交的数据,未提交的数据对其他事务是不可见的。这种隔离级别可以避免脏读,但仍可能出现不可重复读和幻读

  3. 可重复读(Repeatable Read)——默认:保证在同一个事务中多次读取相同记录的结果是一致的。其他事务对于同一条记录的修改在当前事务中是不可见的,可以避免脏读和不可重复读,但仍可能出现幻读

  4. 可串行化(Serializable):最高的隔离级别,通过强制事务串行执行来避免不可重复读和幻读。在这个级别下,所有事务按顺序执行,可以避免所有类型的并发问题,但会降低并发性能。

可以通过以下语句设置事务的隔离级别:

SET TRANSACTION ISOLATION LEVEL <isolation_level>;
SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

其中 <isolation_level> 可以是 READ UNCOMMITTEDREAD COMMITTEDREPEATABLE READSERIALIZABLE

选择合适的事务隔离级别需要根据具体的业务需求和并发访问情况进行权衡,以确保既能保证数据的一致性,又能提供良好的并发性能。

脏读、不可重复读和幻读

脏读、不可重复读和幻读是数据库中常见的并发问题。

  1. 脏读:脏读是指一个事务读取到了另一个事务未提交的数据。例如,事务A修改了一条记录,但还没有提交,此时事务B读取了这条记录,得到了被修改后的结果,但随后事务A回滚了操作,导致事务B读取到的数据实际上是无效的。脏读会导致数据的不一致性,因此需要避免。

  2. 不可重复读:不可重复读是指一个事务在两次读取同一条记录期间,另一个事务修改了该记录,导致前一个事务读取到的数据不一致。例如,事务A读取了一条记录,然后事务B修改了该记录并提交了,此时事务A再次读取同一条记录,得到的结果和之前不同。不可重复读会导致数据的不一致性,也需要避免。

  3. 幻读:幻读是指一个事务在两次查询同一范围内的记录期间,另一个事务插入了符合条件的记录,导致前一个事务得到的结果集不一致。例如,事务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锁篇 - 知乎

常见锁类型及其在数据库中的应用 (锁类型 数据库)-数据运维技术


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

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

相关文章

容器化升级对服务有哪些影响?

容器技术是近几年计算机领域的热门技术&#xff0c;特别是随着各种云服务的发展&#xff0c;越来越多的服务运行在以 Docker 为代表的容器之内。 本文我们就来分享一下容器化技术相关的知识。 容器化技术简介 相比传统虚拟化技术&#xff0c;容器技术是一种更加轻量级的操作…

程序员考公笔记之逻辑判断(图形推理)

文章目录 写在前面1、逻辑判断1.1、图形推理1.1.1、位置类1.1.2、样式类1.1.3、数量类1.1.4、属性类1.1.5、六面体 写在前面 1、逻辑判断 1.1、图形推理 观察&#xff1a;先宏观&#xff0c;再微观 图形推理的命题形式&#xff1a; 一组式 观察路径&#xff1a;顺序看(考最…

数据结构之优先级队列(堆)及top-k问题讲解

&#x1f495;"哪里会有人喜欢孤独&#xff0c;不过是不喜欢失望。"&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;数据结构之优先级队列(堆) 一.优先级队列 1.概念 我们已经学习过队列&#xff0c;队列是一种先进先出(FIFO)的数据结构&#xff…

单线圈无刷直流电机驱动芯片选型分析,可应用于笔记本,显卡风散热风扇,变频冷却风扇,打印机风扇等产品上

单线圈无刷直流电机的电机驱动器。 GC1298R/S&#xff0c;GC1262E/S&#xff0c;GC1298R/S&#xff0c;GC1262R/S具有高效的直接PWM控制方式&#xff0c;它可以控制无刷直流电机转速。它集成了最低速度限制模式、可调速度斜率控制模式、软启动模式、风扇转速计、锁保护、自动重…

PGSQL 设置autovacuum

VACUUM和ANALYZE是PostgreSQL 数据库维护最重要的两个操作。 vacuum用于恢复表中“死元组”占用的空间。删除或更新&#xff08;删除后插入&#xff09;记录时&#xff0c;将产生死元组。PostgreSQL不会从表中物理删除旧行&#xff0c;而是在其上放置一个“标记”&#xff0c;以…

java定位系统源码,UWB技术的无线定位系统源码

UWB技术是一种传输速率高&#xff0c;发射功率较低&#xff0c;穿透能力较强并且是基于极窄脉冲的无线技术。UWB最优的应用环境是室内或者相对密闭的空间&#xff0c;有着厘米级的定位精度&#xff0c;不仅可以非常精准地进行位置跟踪&#xff0c;还可以快速地进行数据传输。 智…

DNF 单机联网 搭建教程(附视频)

更多游戏搭建&pvf修改教程请见: DNF教程 注意&#xff1a;请不要将游戏进行商业化&#xff0c;一切后果概不负责。仅供单机&#xff0c;好友之间进行娱乐&#xff01;&#xff01; 注意&#xff1a;请不要将游戏进行商业化&#xff0c;一切后果概不负责。仅供单机&#…

Vue笔记-在axios中的than函数中使用this需要注意的地方

在Vue中&#xff0c;可以使用this关键字来访问到组件中定义的变量。然而&#xff0c;在axios的then函数中&#xff0c;this关键字的作用域会改变&#xff0c;会指向axios对象本身而不是Vue组件实例。因此&#xff0c;不能直接访问到Vue组件中定义的变量。 解决这个问题的一种方…

git入门教程+常用命令

Git入门教程 本文章主要参照视频教程&#xff1a;https://www.bilibili.com/video/BV1FE411P7B3/?spm_id_from333.337.search-card.all.click&vd_source06caf161b187fb3f4c039bc15e238fea 为什么要使用GIT 版本控制是项目、文档迭代的必然要求&#xff0c;所以需要使用…

如何在 IDEA 中设置远程连接服务器开发环境并实现固定地址远程 Linux 环境

文章目录 1. 检查Linux SSH服务2. 本地连接测试3. Linux 安装Cpolar4. 创建远程连接公网地址5. 公网远程连接测试6. 固定连接公网地址7. 固定地址连接测试 本文主要介绍如何在IDEA中设置远程连接服务器开发环境&#xff0c;并结合Cpolar内网穿透工具实现无公网远程连接&#xf…

肥猫游戏报价器|计价器|王者荣耀代练陪练等游戏报价器软件介绍说明

目录 1. 前言2. 软件著作权3. 软件使用说明3.1 进入软件3.2 用户登录3.3 首页3.4 报价器3.4.1 总体介绍3.4.2 王者报价器3.4.3 LOL手游报价器3.4.4 英雄联盟报价器3.4.5 云顶之弈报价器3.4.7 王者水晶报价器3.4.8 和平精英报价器3.4.9 蛋仔派对报价器3.4.10 穿越火线报价器3.4.…

西工大网络空间安全学院计算机系统基础实验二(phase_2下——漫漫深夜过后的黎明!!!)

内存地址内存地址中的数注释指向这块内存的寄存器0xffffd0e8函数phase_2的栈帧0xffffd0e40xffffd0f4函数phase_2的栈帧0xffffd0e00x5655b7b0函数phase_2的栈帧0xffffd0dc0x565566ca函数read_six_numbers的返回地址&#xff0c;函数phase_2的栈帧0xffffd0d80x5655af64旧%ebx的值…

使用加密软件Enigma Protector,可以轻松获得软件许可!

软件许可是在互联网上销售商业软件以及将程序的使用锁定到特定用户或计算机的最常用方式。在这篇文章中&#xff0c;我将解释什么是软件许可证以及如何使用Enigma Protector将其应用到现有软件。 The Enigma Protector 是一款专门设计用来为应用程序添加高强度保护的强大工具。…

【VTK】VTK中的宏定义

很高兴在雪易的CSDN遇见你 【vtkWidgetRepresentation】第九期 vtk中的仿射变换 前言 本文分享VTK中的宏定义&#xff0c;希望对各位小伙伴有所帮助&#xff01; 感谢各位小伙伴的点赞关注&#xff0c;小易会继续努力分享&#xff0c;一起进步&#xff01; 你的点赞就是我的…

chrome浏览器使用flash player

今天用chrome打开学校校园网&#xff0c;显示不出来成绩单提示如下&#xff1a; 结果下了也没用。 Chrome浏览器在2020年12月已经停止支持Flash Player插件&#xff0c;所以无法在Chrome浏览器上使用Flash Player。 使用其他浏览器 如果之前安装了Flash Player插件的小伙伴&…

关于引用unpkg.com的mars3d相关依赖文件报错无法请求的说明

问题来源&#xff1a; 1.关于引用unpkg.com的mars3d相关依赖文件报错无法请求的说明 说明&#xff1a; 1.最近npm、unpkeg都访问异常&#xff0c;可能是unpkg.com等国外的服务器不稳定导致的请求未响应。 解决方案&#xff1a; 1.请切换静态文件引入的方式请求相关资源。参…

QEMU源码全解析 —— virtio(1)

接前一篇文章&#xff1a; 本文内容参考&#xff1a; 《趣谈Linux操作系统》 —— 刘超&#xff0c;极客时间 《QEMU/KVM》源码解析与应用 —— 李强&#xff0c;机械工业出版社 特此致谢&#xff01; virtio简介 对于一台虚拟机而言&#xff0c;除了要虚拟化CPU和内存&…

Linux:符号和符号表

文章目录 什么是符号&#xff1f;什么是符号表&#xff1f;全局符号和本地符号1. 全局符号&#xff1a;symtab符号表 2. 本地符号&#xff1a; 符号在汇编阶段符号在链接阶段1.由模块 m 定义并能被其他模块引用的全局符号。2.由其他模块定义并被模块 m 引用的全局符号。3.只被模…

电脑长截图、滚动截图软件!早用早享受!

FastStone Capture软件在屏幕捕捉、滚动截屏、屏幕录制、图片处理方面能力十分突出&#xff0c; 帮助用户以专业的方式来创建所需图片或视频。 最新版本 : FastStone Capture 10.3 软件大小 : 7.75MB 适配系统 : Windows Vista/7/8/10/11&#xff0c;WinXP 软件名称&#xff1a…

VCSA7.0加入Windows AD域失败的处理过程

一、问题现象 vcsa7.0加入AD域时提示“Idm client exception: Error trying to join AD, error code 2453” 二、处理过程 &#xff08;一&#xff09;检查是否DNS问题 查看dns是否设置正确&#xff0c;如下&#xff1a; 1. Enable SSH on VCSA. 2. Command> shell 3…