文章目录

      • 一、先明确交易流水表的核心特性
      • 二、InnoDB的锁机制在流水表写入场景的表现
        • 1. 行锁(Record Lock):基本不涉及
        • 2. 间隙锁(Gap Lock)与Next-Key Lock:几乎不触发
        • 3. 表锁:仅在极端场景出现
      • 三、死锁风险:几乎为零
      • 四、潜在锁等待场景及规避方案
        • 1. 主键无序导致的插入位置冲突
        • 2. 后台任务的范围锁阻塞插入
        • 3. DDL操作阻塞写入
      • 五、总结

InnoDB引擎的交易流水表在“高QPS大量写入、无更新”场景下,锁等待或死锁的概率极低,但仍需注意特定场景下的潜在风险。以下从InnoDB锁机制本质出发,结合流水表特性具体分析:

一、先明确交易流水表的核心特性

交易流水表的典型特征是:

  • 只写不更删:数据一旦写入,不会执行UPDATEDELETE(即使错误也通过“冲正流水”新增反向记录,而非修改原记录);
  • 主键有序:通常用雪花算法或自增ID作为主键(PRIMARY KEY),写入时按主键顺序追加;
  • 高频插入:QPS可能达数千甚至数万,需持续写入新记录。

二、InnoDB的锁机制在流水表写入场景的表现

InnoDB的锁(行锁、间隙锁、表锁等)主要针对并发修改(UPDATE/DELETE) 设计,而流水表的“纯插入”场景几乎不触发复杂锁逻辑:

1. 行锁(Record Lock):基本不涉及

行锁用于锁定特定记录,防止并发修改。但流水表无UPDATE/DELETE操作,只有INSERT,而INSERT操作仅在“插入瞬间”对新生成的记录加短暂的行锁(用于事务隔离),且插入完成后立即释放,不会产生锁等待。

例外场景:若插入的主键值已存在(如主键重复),InnoDB会对“已存在的记录”加行锁,导致后续插入失败并报错Duplicate entry,但这是业务错误(主键生成逻辑问题),并非锁等待。

2. 间隙锁(Gap Lock)与Next-Key Lock:几乎不触发

间隙锁用于锁定“记录之间的间隙”,防止并发插入导致的“幻读”,是InnoDB在RR(Repeatable Read)隔离级别下的核心锁机制。但它的触发条件是:

  • 基于非唯一索引范围查询执行UPDATE/DELETE(如DELETE FROM log WHERE amount > 1000);
  • 或使用唯一索引但条件为范围查询(如UPDATE log SET status=1 WHERE id BETWEEN 100 AND 200)。

而流水表的特性决定了:

  • UPDATE/DELETE,不会主动触发间隙锁;
  • INSERT操作可能在“插入位置”产生临时的“插入意向锁”(Insert Intention Lock),这是一种间隙锁的兼容锁,仅用于表示“插入意图”,多个事务插入不同位置时互不阻塞(如主键有序的流水表,事务A插入ID=100,事务B插入ID=101,两者插入位置不同,无锁冲突)。

唯一风险:若流水表存在非唯一索引且有其他业务操作(如后台统计任务执行SELECT ... FOR UPDATE范围查询),可能对索引间隙加锁,导致新插入的记录恰好落在锁范围内,引发INSERT等待。但流水表通常无此类操作(纯写入,查询走从库),因此风险极低。

3. 表锁:仅在极端场景出现

InnoDB默认行锁,但以下情况会触发表锁:

  • 执行ALTER TABLE等DDL操作(会加表级排他锁);
  • 未命中索引的UPDATE/DELETE(退化为表锁)。

流水表若需在线加字段或索引(DDL),会阻塞所有写入(INSERT),导致锁等待。但这是运维操作导致的,并非写入本身引发。

三、死锁风险:几乎为零

死锁的产生需要“多个事务相互持有对方需要的锁”,而流水表的纯写入场景:

  • 所有事务仅执行INSERT,操作的是不同的新记录(主键有序时,插入位置递增,无重叠);
  • UPDATE/DELETE,不会持有旧记录的锁;
  • 插入意向锁是兼容的(同一间隙可并发插入不同位置),不会产生相互等待。

因此,纯写入的流水表几乎不可能出现死锁

四、潜在锁等待场景及规避方案

虽然风险低,但以下场景可能引发锁等待,需提前规避:

1. 主键无序导致的插入位置冲突

若流水表主键是无序的(如UUID),INSERT会随机写入B+树的>不同位置,可能导致多个事务在同一间隙竞争插入意向锁,引发短暂等待(通常毫秒级,不影响整体性能)。

规避:用有序主键(如雪花算法,包含时间戳),确保INSERT在B+树尾部顺序追加,避免间隙竞争。

2. 后台任务的范围锁阻塞插入

若有后台任务(如定时统计)对流水表执行SELECT ... FOR UPDATE(加排他锁的范围查询),且查询条件命中非唯一索引,会锁定对应间隙,导致新插入的记录落在锁范围内时被阻塞。

规避

  • 统计查询走从库,避免在主库执行加锁查询;
  • 若必须在主库查询,改用SELECT ... LOCK IN SHARE MODE(共享锁),或不加锁(依赖MVCC快照读)。
3. DDL操作阻塞写入

执行ALTER TABLE(如加索引、加字段)时,InnoDB会加表级排他锁,阻塞所有INSERT,导致写入等待。

规避

  • 用Online DDL工具(如pt-online-schema-change),避免锁表;
  • 选择流量低谷执行DDL,并限制单次操作的数据量。

五、总结

InnoDB交易流水表在“高QPS大量写入、无更新”场景下:

  • 无死锁风险:纯插入操作不会产生锁竞争循环;
  • 锁等待概率极低:仅在“主键无序+高并发”“后台加锁查询”“执行DDL”等特殊场景可能出现,且可通过优化规避;
  • 间隙锁几乎不触发:因无UPDATE/DELETE操作,不会主动加间隙锁,插入意向锁兼容不阻塞。

最佳实践

  1. 用有序主键(如雪花算法),确保插入顺序追加;
  2. 禁止在主库执行加锁的范围查询(FOR UPDATE);
  3. 避免频繁执行DDL,必要时用Online DDL工具;
  4. 监控Innodb_row_lock_waits等指标,及时发现异常锁等待。

通过以上设计,流水表可稳定支撑高QPS写入,几乎无锁相关问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/97878.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/97878.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/97878.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

项目部署——LAMP、LNMP和LTMJ

前情提要问:如何通过nginx的反向代理,代理多台虚拟主机(一台apache服务器上的虚拟主机)?1.在nginx的配置文件中,将基于域名的访问改为基于端口的访问(nginx.conf)upstream daili{ser…

晨曦中,它已劳作:一台有温度的机器人如何重塑我们的洁净日常

清晨六点,城市的轮廓在微光中逐渐清晰。某高端小区的路面上,一台灰色机身、线条流畅的机器正在安静地工作。它绕过停靠的车辆,精准地沿着路缘石前进,吸走落叶与尘土,遇到突然窜出的流浪猫时轻巧避让,仿佛有…

【最新高级版】酷柚易汛生产管理系统v1.2.8 +uniapp全开源+文档教程

酷柚易汛生产管理系统是基于FastAdminThinkPHPLayuiuniapp开发的生产管理系统,帮助企业数字化转型,打造智能工厂,专业为生产企业量身开发的一套完整的生产管理系统。主要包含以下模块:购货模块、生产模块、仓库模块、资料模块&…

40分钟的Docker实战攻略

一:什么是Docker (1)基本概念 Docker 是一种开源的 容器化平台,用于快速构建、部署和运行应用程序。它通过将应用程序及其依赖项打包到轻量级的、可移植的容器中,实现了环境一致性,解决了“在我机器上能运…

qt使用camke时,采用vcpkg工具链设置OSG的qt模块osgQOpenGLWidget

【免费】osgQOpenGLWidget嵌入qt模块,VS2022使用cmake的方式,工具链vcpkg资源-CSDN下载 CMake中设置 1.查找osg相关的库,同时也会设置对应include的路径 # 检查是否找到 osg find_package(OpenSceneGraph 3.6.5REQUIRED COMPONENTS osgosgUtilosgGAosgViewerosgDBosgAnimatio…

洛谷 P2245 星际导航(kruskal 重构树 + 倍增优化求路径最大边权)

题目链接 题目难度 洛谷上是蓝题&#xff0c;我觉得这道题挺简单的&#xff0c;一眼就看穿了&#xff0c;应该是绿题。 题目解法概括 kruskal 重构树 倍增优化求路径最大边权。 代码 #include <iostream> #include <vector> #include <algorithm> #in…

STM32H743-ARM例程1-IDE环境搭建与调试下载

目录实验平台环境搭建一、Keil MDK集成开发环境1.MDK简介2.MDK5安装3.程序下载与调试二、STM32CubeMX1.STM32CubeMX简介2.JAVA JRE安装3.STM32CubeMX安装4.STM32CubeH7库安装实验平台 硬件&#xff1a;银杏科技GT7000双核心开发板-ARM-STM32H743XIH6&#xff0c;银杏科技iTool…

FPGA学习篇——Verilog学习MUX的实现

PS&#xff1a;目前手上仍然没有板子&#xff0c;按照野火视频的讲解&#xff0c;目前我们只能做到前面六步&#xff08;其实第一步设计规划也是需要看板子的硬件的&#xff0c;但是现在没有板子就完全与野火传授的板子一致来看&#xff09; 首先我们以最简单的2路选择器MUX2_1…

OpenStack 学习笔记

OpenStack 1. 什么是 OpenStack 1.1 OpenStack 发展史 2006 年亚马逊推出 AWS&#xff0c;正式开启云计算的新纪元 2010 年 7 月美国国家航空航天局&#xff08;NASA&#xff09;与 Rackspace 合作&#xff0c;共同宣布 OpenStack 开放源码计划&#xff0c;由此开启了属于 Open…

mysql小数取整

1 向下取整 SELECT FLOOR(123.456); -- 结果: 1232 向上取整 SELECT CEIL(123.001); -- 结果: 1243 四舍五入 SELECT ROUND(123.456); -- 结果: 123 SELECT ROUND(123.556); -- 结果: 1244 截断&#xff08;不四舍五入&#xff0c;直接截断小数位&#xff09; SELECT …

Day43 PHP(mysql不同注入类型、mysql不同注入点、mysql传输不同数据类型 )

一、不同注入类型实际&#xff1a;我们未知sql是哪种类型&#xff0c;只能靠试/使用sql工具原理&#xff1a;闭合程序员写的sql语句&#xff0c;并且执行我们所需要的sql语句&#xff0c;最后将闭合后多余的 用-- 或者#注释掉。 总结一下就是先闭合&#xff0c;后注释。共四种…

Linux应用开发(君正T23):三网智能切换及配网功能

前段时间接手了一个监控项目&#xff0c;其中甲方对于设备的要求有一条就是实现网口eth、WiFi、4G三种手段的联网方式并且当某一个网络不好的时候就去切换到下一个能用的网络&#xff0c;让监控设备持续不断的有网络&#xff0c;保证监控数据的上传。这个部分的功能就交由我来实…

IvorySQL 4.6:DocumentDB+FerretDB 实现 MongoDB 兼容部署指南

背景 MongoDB 诞生之初&#xff0c;便以出色的易用性与详尽的驱动程序文档脱颖而出&#xff0c;堪称对传统关系型数据库的一次重要革新&#xff0c;也正因如此&#xff0c;它迅速成为开发者社区的热门之选。 然而&#xff0c;随着其许可模式从开源转向 SSPL 许可证&#xff0…

论文阅读:arixv 2025 One Token to Fool LLM-as-a-Judge

总目录 大模型相关研究&#xff1a;https://blog.csdn.net/WhiffeYF/article/details/142132328 https://arxiv.org/pdf/2507.08794 https://www.doubao.com/chat/20698287584991234 速览 这篇文档主要讲了一个关于“大语言模型当裁判”的重要发现——很多我们以为靠谱的AI裁…

webrtc弱网-AlrDetector类源码分析与算法原理

AlrDetector&#xff08;应用受限区域检测器&#xff09;是WebRTC中用于检测发送端是否处于应用层限速状态的核心组件。它通过维护一个基于时间间隔的预算系统&#xff0c;监控实际发送数据量与网络容量之间的关系。当发送速率持续低于网络容量的设定比例&#xff08;如65%&…

ABP + Verify(快照) 驱动的 PDF/Excel 导出回归

ABP + Verify(快照) 驱动的 PDF/Excel 导出回归 🚀 📚 目录 ABP + Verify(快照) 驱动的 PDF/Excel 导出回归 🚀 0) TL;DR ✨ 1) 背景与目标 🎯 2) 架构与职责(解耦渲染器) 🧩 3) “确定性”前置条件(去伪差异) 🔒 4) PDF 回归策略(以 QuestPDF 为例) 📄 4.…

SIFT特征匹配实战:KNN算法实现指纹认证

这个利用了前面学到的SIFT特征检测来实现的&#xff0c;然后这里主要就是引入了一个新的匹配器。这里匹配是用KNN算法进行匹配的。下面来看下细节。介绍函数由于要频繁展示&#xff0c;所以这里定义了一个函数。def cv_show(name, img):cv2.imshow(name, img)cv2.waitKey(0)导入…

网络安全渗透测试第一步信息收集

信息收集是渗透测试中最基础且关键的一步&#xff0c;它直接影响后续漏洞发现和利用的成功率。本文将系统介绍信息收集的常用方法、工具和技巧&#xff0c;帮助你在实战中高效定位目标弱点。 一、搜索引擎利用 1. Google Hacking 通过Google搜索语法快速定位敏感信息、后台地…

C++——类和对象1

1.类的定义1.1 类定义格式class为定义类的关键字&#xff0c;Stack为类的名字&#xff0c;{ }中的内容是类的主题为了&#xff0c;注意类定义结束时后面的分号不能省略。类体中的内容称为类的成员&#xff1a;类中的变量称为类的属性或成员变量&#xff1b;类中的函数称为类的方…

动手学Agent:Agent设计模式——构建有效Agent的7种模型

Agent本身的定义也不是绝对的&#xff0c;从LLM到最高等级的Agent&#xff0c;中间是有大量灰度地带的&#xff0c;在Anthropic看来&#xff0c;Agent可以以多种方式定义&#xff0c;有些人将完全自主系统定义为Agent&#xff0c;而另一些团队则将预定义的工作流程定义为Agent。…