当前位置: 首页 > news >正文

数据库锁机制

数据库锁机制

数据库锁主要分为三大类

1.全局锁

2.表级锁

3.行级锁

全局锁
  • 定义:全局锁是对整个数据库实例加锁,禁止所有对数据库的写操作。

  • 用途:主要用于备份和维护操作。

  • 示例

    MySQL

    FLUSH TABLES WITH READ LOCK;
    

    这条命令会锁定所有表,只允许读操作,禁止写操作。

    解锁

    UNLOCK TABLES;
    
表级锁
  • 定义:表级锁是对整个表加锁,限制对表的并发访问。

  • 用途:适用于低并发场景,管理开销较小。

    表级锁分为:读锁和写锁

    读锁(共享锁,S 锁)

    • 定义:允许多个事务同时读取同一张表,但不允许任何事务对该表进行写操作。
    • 用途:适用于读多写少的场景,确保数据的一致性。
    • 特点:多个读锁可以共存。读锁与写锁互斥,即一个表上有读锁时,不能加写锁。
    LOCK TABLES table_name READ;
    

    这条命令会对指定表加共享锁,允许多个事务读取,但禁止写操作。

    写锁(排他锁,X 锁)

    • 定义:只允许一个事务对表进行读取和写操作,排除其他事务的任何访问。
    • 用途:适用于写多读少的场景,确保数据的独占性。
    • 特点:排他锁与其他任何类型的锁互斥,即一个表上有写锁时,不能加任何其他锁。
    LOCK TABLES table_name WRITE;
    

    这条命令会对指定表加排他锁,只允许一个事务读写,禁止其他事务访问。

    元数据锁(Metadata Lock,MDL)

    • 定义:元数据锁用于保护表的元数据(如表结构、索引等),防止在事务执行过程中表结构被修改。
    • 用途:确保在事务执行期间表的结构不会发生变化,防止数据不一致。
    • 特点:元数据锁分为读锁和写锁。读锁允许多个事务同时读取元数据,但不允许修改。写锁只允许一个事务修改元数据,排除其他事务的任何访问。

    读元数据锁

    SELECT * FROM table_name;
    

    写元数据锁

    ALTER TABLE table_name ADD COLUMN new_column INT;
    

    自增锁(Auto-Increment Lock)

    • 定义:自增锁用于管理自增列(AUTO_INCREMENT)的值分配,确保在并发插入时自增值的唯一性和连续性。
    • 用途:防止多个事务同时插入自增列时产生冲突。
    • 特点:自增锁在插入新记录时自动加锁,确保自增值的分配。InnoDB 存储引擎提供了多种自增锁模式,可以通过配置参数调整。

    插入新记录时自动加锁:

    INSERT INTO table_name (column1, column2) VALUES ('value1', 'value2');
    

    InnoDB 存储引擎提供了以下几种自增锁模式,可以通过配置参数 innodb_autoinc_lock_mode 调整:

    传统模式(Traditional Mode,0)

    • 插入每一条记录时都会加表级锁,确保自增值的连续性。

    • 适用于需要严格连续自增值的场景。

    • 示例

      SET GLOBAL innodb_autoinc_lock_mode = 0;
      

    连续模式(Consecutive Mode,1)

    • 插入一批记录时加一次表级锁,确保自增值的连续性。

    • 适用于大多数场景,平衡了性能和连续性。

    • 示例

      SET GLOBAL innodb_autoinc_lock_mode = 1;
      

    交错模式(Interleaved Mode,2)

    • 插入每一条记录时不加表级锁,自增值可能不连续。

    • 适用于高性能场景,牺牲了自增值的连续性。

    • 示例

      SET GLOBAL innodb_autoinc_lock_mode = 2;
      

    解锁

    UNLOCK TABLES;
    
行级锁
  • 定义:行级锁是对表中的单个行加锁,限制对特定行的并发访问。

  • 用途:适用于高并发场景,管理开销较大,但并发性能更高。

    行级锁的类型更为多样,主要包括记录锁、间隙锁、临键锁等。

    记录锁(Record Lock)

    • 定义:锁定索引记录本身。
    • 用途:确保对特定行的独占访问。
    • 特点:只锁定索引记录,不影响其他行。适用于高并发场景,减少锁的竞争。
    SELECT * FROM table_name WHERE id = 1 FOR UPDATE;
    

    这条命令会对查询结果中的行加排他锁,确保在事务提交前其他事务不能修改这些行。

    间隙锁(Gap Lock)

    • 定义:锁定索引记录之间的间隙。
    • 用途:防止其他事务在该间隙内插入新记录。
    • 特点:间隙锁不锁定具体的记录,而是锁定记录之间的空隙。适用于防止幻读(Phantom Read)。
    SELECT * FROM table_name WHERE id > 10 AND id < 20 FOR UPDATE;
    

    这条命令会对 id 在 10 和 20 之间的间隙加锁,防止其他事务插入新的记录。

    临键锁(Next-Key Lock)

    • 定义:记录锁和间隙锁的组合,锁定索引记录及其之前的间隙。
    • 用途:确保对特定行及其之前间隙的独占访问。
    • 特点:临键锁不仅锁定记录本身,还锁定记录之前的间隙。适用于防止幻读和不可重复读(Non-Repeatable Read)。
    SELECT * FROM table_name WHERE id = 10 FOR UPDATE;
    

    这条命令会对 id 为 10 的记录及其之前的间隙加锁,确保在事务提交前其他事务不能修改这些行或插入新的记录。

    总结
    • 表级锁

      读锁(共享锁,S 锁):允许多个事务同时读取同一张表,但不允许写操作。

      写锁(排他锁,X 锁):只允许一个事务对表进行读取和写操作,排除其他事务的任何访问。

      元数据锁(Metadata Lock,MDL):保护表的元数据,防止在事务执行过程中表结构被修改。

      自增锁(Auto-Increment Lock):管理自增列的值分配,确保在并发插入时自增值的唯一性和连续性。

    • 行级锁

      记录锁(Record Lock):锁定索引记录本身,确保对特定行的独占访问。

      间隙锁(Gap Lock):锁定索引记录之间的间隙,防止其他事务在该间隙内插入新记录。

      临键锁(Next-Key Lock):记录锁和间隙锁的组合,锁定索引记录及其之前的间隙,确保对特定行及其之前间隙的独占访问。

    InnoDB 存储引擎

    InnoDB 默认使用行级锁

InnoDB 与 MyISAM 的区别

  1. 锁机制
  • InnoDB

    支持行级锁,适用于高并发场景。

    支持事务和外键约束,确保数据的一致性和完整性。

    使用多版本并发控制(MVCC),提高并发性能。

  • MyISAM

    支持表级锁,适用于低并发场景。

    不支持事务和外键约束,适合简单的读写操作。

    不支持 MVCC,性能较低。

  1. 事务支持
  • InnoDB

    支持事务,可以回滚和提交事务。

    支持 ACID(原子性、一致性、隔离性、持久性)特性。

  • MyISAM

    不支持事务,没有回滚和提交操作。

    不支持 ACID 特性。

  1. 外键约束
  • InnoDB

    支持外键约束,确保数据的引用完整性。

  • MyISAM

    不支持外键约束。

  1. 存储方式
  • InnoDB

    使用聚集索引,主键索引和数据存储在一起。

    支持全文索引。

  • MyISAM

    使用非聚集索引,索引和数据分开存储。

    支持全文索引。

  1. 性能
  • InnoDB

    适用于高并发读写操作,性能较好。

    支持并发插入和更新操作。

  • MyISAM

    适用于低并发读操作,性能较低。

    插入和更新操作可能会导致表锁竞争。

相关文章:

数据库锁机制

数据库锁机制 数据库锁主要分为三大类 1.全局锁 2.表级锁 3.行级锁 全局锁 定义&#xff1a;全局锁是对整个数据库实例加锁&#xff0c;禁止所有对数据库的写操作。 用途&#xff1a;主要用于备份和维护操作。 示例 MySQL FLUSH TABLES WITH READ LOCK;这条命令会锁定所…...

呼叫中心系统如何选型?

呼叫中心系统如何选型&#xff1f; 作者&#xff1a;开源呼叫中心系统 FreeIPCC 采购一套呼叫中心系统是企业提升客户服务质量、优化运营流程、增强市场竞争力的关键步骤。一个合适的呼叫中心系统不仅能提升客户满意度&#xff0c;还能提高内部团队的工作效率&#xff0c;降低…...

Ubuntu 22.04安装部署

一、部署环境 表 1‑1 环境服务版本号系统Ubuntu22.04 server lts运行环境1JDK1.8前端WEBNginx1.8数据库postgresqlpostgresql13postgis3.1pgrouting3.1消息队列rabbitmq3.X(3.0以上)运行环境2erlang23.3.3.1 二、安装系统 2.1安装 1.安装方式&#xff0c;选第一条。 2.选择…...

KINGBASE部署

环境&#xff1a;x86_64 系统&#xff1a;centos7.9 数据库–版本&#xff1a;KingbaseES_V008R006C008B0014_Lin64_install 授权文件–版本&#xff1a;V008R006-license-企业版-90天 一 前置要求 1.1. 硬件环境要求 KingbaseES支持通用X86_64、龙芯、飞腾、鲲鹏等国产C…...

探索 ONLYOFFICE:开源办公套件的魅力

文章目录 引言一、ONLYOFFICE 产品介绍与历史1.1 ONLUOFFICE 介绍1.2 ONLYOFFICE发展历史 二、ONLYOFFICE 的核心功能2.1 文档处理2.2 演示文稿 三、ONLYOFFICE 部署与安装四、ONLYOFFICE 产品优势和挑战五、ONLYOFFICE 案例分析六、ONLYOFFICE 的未来发展七、全文总结 引言 在…...

如何保护网站安全

1. 使用 Web 应用防火墙&#xff08;WAF&#xff09; 功能&#xff1a;WAF 可以实时检测和阻止 SQL 注入、跨站脚本&#xff08;XSS&#xff09;、文件包含等常见攻击。它通过分析 HTTP 流量来过滤恶意请求。 推荐&#xff1a;可以使用像 雷池社区版这样的 WAF&#xff0c;它提…...

抖音矩阵系统开发的技术框架解析,支持OEM

一、引言 随着短视频平台的兴起&#xff0c;抖音已成为全球范围内极具影响力的社交娱乐应用。对于企业和创作者而言&#xff0c;构建抖音矩阵系统可以实现多账号管理、内容分发与优化、数据分析等功能&#xff0c;从而提升品牌影响力和内容传播效果。本文将详细探讨抖音矩阵系统…...

python偏相关分析

偏相关分析含义 偏相关分析是一种用于测量两个变量之间关系的统计方法&#xff0c;它可以控制&#xff08;排除&#xff09;其他变量的影响。与简单的相关分析不同&#xff0c;偏相关分析可以帮助我们了解在控制某些干扰因素后&#xff0c;两个变量之间的“净”关系。比如&…...

低代码用户中心:简化开发,提升效率的新时代

随着数字化转型的加速&#xff0c;企业对于快速交付高质量应用的需求日益增长。在这个背景下&#xff0c;低代码开发平台应运而生&#xff0c;成为越来越多企业和开发者的首选工具。今天&#xff0c;我们将聚焦于低代码用户中心&#xff0c;探讨其如何帮助开发者简化流程、提升…...

ThingsBoard规则链节点:Math Function节点详解

引言 1. Math Function 节点简介 2. 节点配置 2.1 基本配置示例 3. 使用场景 3.1 数据预处理 3.2 阈值判断 3.3 复杂计算 3.4 动态阈值 4. 实际项目中的应用 4.1 项目背景 4.2 项目需求 4.3 实现步骤 5. 总结 引言 ThingsBoard 是一个开源的物联网平台&#xff0c…...

echarts地图,柱状图,折线图实战

1.地图 <template><div style"height: 100%;" class"cantainerBox"><div class"top"><div class"leftTop"><span class"firstSpan">推广进度</span><div>省份选择&#xff1a;&l…...

客服宝快捷回复软件:客服工作的得力助手

在从事客服工作的这段漫长时间里&#xff0c;响应率和满意度一直是我最为头疼的绩效指标。这两个指标就如同两座大山&#xff0c;压得我时常喘不过气来。 然而&#xff0c;幸运的是&#xff0c;最近我安装了客服宝这个快捷回复软件&#xff0c;这一举措如同为我打开了一扇新的…...

laravel: Breeze 和 Blade, 登录 注册等

composer require laravel/breeze --dev php artisan breeze:install php artisan migrate npm install npm run build php artisan route:clear http://laravel-dev.cn/ http://laravel-dev.cn/register http://laravel-dev.cn/login...

RocketMQ 消息消费失败的处理机制

在分布式消息系统中&#xff0c;处理消费失败的消息是非常关键的一环。 RocketMQ 提供了一套完整的消息消费失败处理机制&#xff0c;下面我将简要介绍一下其处理逻辑。 截图代码版本&#xff1a;4.9.8 步骤1 当消息消费失败时&#xff0c;RocketMQ会发送一个code为36的请求到…...

三、Java并发 Java 线程池 ( Thread Pool )

一、前言 本文我们将讲解 Java 中的线程池 ( Thread Pool )&#xff0c;从 Java 标准库中的线程池的不同实现开始&#xff0c;到 Google 开发的 Guava 库的前世今生 注&#xff1a;本章节涉及到很多前几个章节中阐述的知识点。我们希望你是按照顺序阅读下来的&#xff0c;不然…...

zabbix安装配置与使用

zabbix Zabbix的工作原理如下: 监控部分: Zabbix Agent安装在各个需要监控的主机上,它以主配置的时间间隔(默认60s)收集主机各项指标数据,如CPU占用率、内存使用情况等。 通讯部分: Agent会把收集的数据通过安全通道(默认10051端口)发送到Zabbix Server。Server会存储这些数…...

第3关:命题逻辑推理

任务描述 相关知识 实验用例 实验原理和方法 编程要求 测试说明 任务描述 本关任务&#xff1a;用命题逻辑推理的方法解决逻辑推理问题。加深对命题逻辑推理方法的理解。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a;1.命题符号化&#xff0c;2.命题推理。 …...

第三份代码:VoxelNet的pytorch实现

VoxelNet是点云体素化处理的最开始的网络结构设计&#xff0c;通过完全弄明白整个VoxelNet的pytorch实现是非常有必要的。 参考的代码是这一份&#xff1a;GitHub - RPFey/voxelnet_pytorch: modification of voxelnet 参考文章&#xff1a;VoxelNet论文解读和代码解析_voxel…...

Backtrader-Broker05

本系列是使用Backtrader在量化领域的学习与实践&#xff0c;着重介绍Backtrader的使用。Backtrader 中几个核心组件&#xff1a; Cerebro&#xff1a;BackTrader的基石&#xff0c;所有的操作都是基于Cerebro的。Feed&#xff1a;将运行策略所需的基础数据加载到Cerebro中&…...

分布式和微服务系统区别

一、分布式是更广泛的概念&#xff0c;指将计算分布在多个物理节点上的系统。 适用于需要高可用性、高性能、可扩展性的系统。 应用场景&#xff1a;分布式数据库—数据高可用存储、分布式缓存—提升数据访问速度 分布式计算框架—大规模数据计算、分布式文件系统—海量数据的…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

基于 TAPD 进行项目管理

起因 自己写了个小工具&#xff0c;仓库用的Github。之前在用markdown进行需求管理&#xff0c;现在随着功能的增加&#xff0c;感觉有点难以管理了&#xff0c;所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD&#xff0c;需要提供一个企业名新建一个项目&#…...

C++.OpenGL (20/64)混合(Blending)

混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别

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

Vite中定义@软链接

在webpack中可以直接通过符号表示src路径&#xff0c;但是vite中默认不可以。 如何实现&#xff1a; vite中提供了resolve.alias&#xff1a;通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?

在工业自动化持续演进的今天&#xff0c;通信网络的角色正变得愈发关键。 2025年6月6日&#xff0c;为期三天的华南国际工业博览会在深圳国际会展中心&#xff08;宝安&#xff09;圆满落幕。作为国内工业通信领域的技术型企业&#xff0c;光路科技&#xff08;Fiberroad&…...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准

城市路内停车管理常因行道树遮挡、高位设备盲区等问题&#xff0c;导致车牌识别率低、逃费率高&#xff0c;传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法&#xff0c;正成为破局关键。该设备安装于车位侧方0.5-0.7米高度&#xff0c;直接规避树枝遮…...