使用数据库唯一键实现事务幂等性

RocketMQ和Kafka如何实现消费者消费的幂等性? RocketMQ 的消费者幂等性需结合业务逻辑自行实现,核心是通过唯一标识 + 状态校验确保多次消费结果一致。推荐优先使用 数据库唯一约束 或 业务状态机 实现,在高并发场景可结合 分布式锁 或 缓存去重。设计时需权衡性能、复杂度和可靠性,避免过度设计。 阅读详情

幂等性

概念

在分布式系统中,幂等性是一致性方面的一个重要概念。

幂等(idempotent、idempotence)是一个数学与计算机学概念,常见于抽象代数中。
在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。

所谓“影响相同”,不是要求返回值完全相同,而且是指后续多余的调用对系统的数据一致性不造成破坏。对于写入类操作,如果第一次写入是成功的,后续的写入应该抛出异常或者空操作,或者执行了写入但是未对数据造成变化。对于读取类操作,需要保证其实现上是真正的读取,不能在读操作中夹带写操作。

场景

需要实现幂等性的典型场景有以下两种:

  1. 客户端发起的请求可能需要重试,请求的后端处理需要保证幂等
  2. 后端系统使用同步RPC调用或异步消息实现分布式事务,消息的消费者需要保证幂等

必要性

重试是降低系统失败率的重要手段。

广义上的RPC,包括客户端对服务端的api调用、后端系统的内网调用、跨机房调用等。一次RPC大体上包括三个步骤:发送请求、执行过程、接收响应。由于网络传输存在不确定性,导致RPC调用存在一个陷阱,即有可能出现第一、第二步都成功、第三步失败的情况,此时RPC的调用方由于接收不到结果,无法判断被调用方是否已经完成过程调用,只能按失败处理。

通常RPC调用方会针对网络失败进行重试。在上述情况下,如果远端代码不具备幂等性,却进行了重试,将导致系统的数据一致性遭到破坏,本该只执行一次的事务被执行了两次。

对于异步消息的消费者来讲,也有同样的问题。在手动ACK的情况下,消息的处理需要接收消息、处理消息、ACK三步,ACK的失败也会导致相同的问题。

在交易类的系统(比如电商、证券等)中,对非幂等的远程过程进行重试,可能会导致超买超卖,对客户造成经济损失。

互联网应用一般都是提供7*24服务的,而互联网应用本身又是快速迭代,后端系统是随时有可能需要进行发布的。发布等同于一次宕机(进程被kill),这意味着对于互联网应用的后端系统,宕机是常态而非特例。这也是幂等性和重试的必要性来源之一。

可重入性

幂等性在技术上同时要求可重入性。在分布式系统中,重试和并发都是常态,允许多次调用代码也应该支持并发调用。分布式锁(包括数据库锁)可以解决这一问题。

技术实现

本地事务的幂等性

考虑简单的增删改查四类操作:

  • select,天生幂等
  • insert,数据库自增主键时不具备幂等
  • 基于主键update,具备幂等,但是带查询的更新除外(形如update t set x = x + 1 where ...)
  • 基于主建delete,具备幂等
  • 非基于主键的udpate/delete操作,需要具体问题具体分析

在分布式系统中,带条件的或带子查询的增删改操作应当慎用,除了非幂等性问题以外,还有可能带来死锁问题。

很显然,如果一个事务中所有数据库操作都是幂等操作,且不存在外部调用,那么该事务一定也是幂等的。

如果事务中存在非幂等的数据库操作,唯一键为本地事务的幂等性提供了实现基础。使用带有唯一键的去重表,在事务中先执行insert去重表,再执行其他业务操作,然后提交事务,事务过程中出现异常回滚事务,可以保证事务的幂等性。

流程图

考虑两种失败的情况。

  1. Insert去重表失败,事务回滚,无任何影响,调用方应停止重试
  2. Insert去重表成功,业务操作失败,事务回滚,之前插入的记录也将消失,无任何影响,调用方可以选择重试

以上两种失败的情况下,事务的幂等性是可以保证的。

补充说明,在使用JDBC连接MySQL的情况下,如果程序需要捕获唯一键冲突异常,可以catchcom.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException。

本地事务并发情况

在并发的情况下,如果两个(数据库的)客户端同时执行该事务且唯一键相同,此时唯一键能直到分布式锁的作用。

这里以示例来说明。打开两个命令行终端,连接同一个MySQL数据库,称之为A和B。

先在任意一端创建测试表

1
create table tt (id int primary key);

 

在两端依次执行

1
set autocommit = false;

 

在A端执行

1
insert into tt (id) values (1);

 

返回

1
Query OK, 1 row affected (0.00 sec)

 

在B端执行同样的insert语句

1
insert into tt (id) values (1);

 

此时B端会挂起。

如果在A端执行

1
commit;

 

A端会提交成功,而B端会立即结束挂起,报错,等于获取锁失败。

1
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'

 

如果A端执行

1
rollback;

 

或直接关闭终端,B端则会立即结束挂起且insert成功,等于获取锁成功。

通过这个实验,同时也可以得出,数据库的唯一键可以用于实现通用的分布式锁。

分布式事务的幂等性

要保证分布式事务的幂等性,需要各个子事务都保证幂等性,否则整体幂等性的很难实现。

在基于关系型数据库的系统中,分布式事务最终还是要依靠数据库的本地事务来实现事务的ACID。

考虑存在A、B两个子系统分别实现各自的事务,需要整合为一个分布式事务,其中A系统的本地事务基于MySQL实现,保证幂等;B系统的本地事务也保证幂等,对外提供RPC服务接口,其具体实现这里不关心。

在这种情况下,有一个简单的不需要事务仲裁者的分布式事务方案,就是在A事务中嵌套对B的调用。具体流程是A事务先执行本地数据库操作,再调用B接口,然后提交事务。

同样,考虑三种失败的情况。

  1. A本地操作失败,事务回滚,无任何影响
  2. A本地操作成功,调用B失败,如果是唯一性冲突导致的失败,A正常提交;如果是其他失败,事务回滚,此时外部调用方可以重试
  3. 很极端的情况,A本地操作成功,调用B成功,事务提交失败,此时外部调用方可以重试

这个方案并不是一个高可靠的解决方案,但是实现上非常简单。

其缺陷在于如果外部调用方没有进行重试,那么可能会产生对B的多余调用。当然,如果在业务上对B的少量多余调用是可接受的,比如B是次要业务,那这个方案也是可以用的。

另外由于在DB事务中嵌套了耗时操作(RPC调用),事务的耗时也因此延长,数据库连接被事务占用不能复用,系统的吞吐量会受到影响。

分布式事务不可能实现绝对的一致性。我们应该从概率的角度思考问题,如果能将不一致的概率降到最低,比如保证幂等性加重试,再辅以业务监控和人工干预,就可以实现系统整体上较高的一致性。

幂等性设计

幂等性设计不能脱离业务来讨论。一般情况下,去重表同时也是业务数据表。对于唯一键,这里提供两种设计思路:

  1. 在请求参数中附带唯一标识作为唯一键,唯一标识可以由业务字段加时间戳低位拼接而成,或者使用snowflake、UUID等ID生成算法
  2. 找出业务本身的唯一约束。比如一个客户对同一只新股只能申购一次,那么客户号加申购代码可以组成唯一键
如何保证MQ消息的幂等性 第一条消息在处理中,由于某种原因一致处理很慢导致最终是失败了,第二条消息(其实是重复的消息)会走一遍先添加的操作,此时添加是失败的,那么会不断的走重试逻辑,重试一定次数之后就会加入到死信的队列中。消费者第一次消费id=1的消息时候,此时消费此时消费成功但是响应MQ的时候超时导致MQ认为当前的消息消费者没有成功消费,过一段时间之后重新投递给消费者消费,那么就导致同样的消息消费者消费了两次,此时消费者需要自己做幂等性的处理。悲观锁可以很好的解决消息幂等性的问题,但是悲观锁的并发度低是一个不容忽视的性能问题。 阅读详情

相关推荐

RocketMQ如何保证幂等性?

设计原则前置过滤(快速失败)最终一致性兜底幂等范围控制(按消息/按操作)实施建议# 启用RocketMQ消息轨迹追踪通过结合业务特性选择合适方案,可将消息重复率控制在10^-6级别。实际场景中推荐采用Redis+DB二级校验的混合模式,兼顾性能与可靠性。

专注后端开发 1365

数据库唯一主键如何实现幂等性?

数据库唯一主键的实现主要是利用数据库中主键唯一约束的特性,一般来说唯一主键比较适用于“插入”时的幂等性,其能保证一张表中只能存在一条带该唯一主键的记录。 使用数据库唯一主键完成幂等性时需要注意的是,该主键一般来说并不是使用数据库中自增主键,而是使用分布式 ID 充当主键,这样才能能保证在分布式环境下 ID 的全局唯一性。 适用操作 插入操作 删除操作 使用限制 需要生成全局唯一主键 ID; 主要流程 主要流程如下: 客户端执行创建请求,调用服务端接口。 服务端执行业务逻辑,生成一个分布式

Leon_Jinhai_Sun的博客 1385

文本→图像→视频:AIGC跨模态转换全流程解析

本文旨在系统性地解析AIGC领域中跨模态内容生成的技术原理和实现方法,特别聚焦于从文本到图像再到视频的完整转换流程。跨模态表示学习的基本原理文本到图像生成的核心技术图像到视频转换的关键算法端到端跨模态生成系统的构建方法实际应用场景和性能优化策略背景介绍:建立基本概念和知识框架核心概念:解析跨模态转换的关键技术和原理算法细节:深入讲解文本到图像、图像到视频的核心算法数学模型:提供必要的数学基础和公式推导项目实战:通过完整案例展示实现过程应用场景:探讨技术的实际应用可能性。

AI天才研究院 1355

数据库--幂等--方案

本文介绍数据库如何处理幂等。包括:SQL幂等语句有哪些,幂等的方案,SQL幂等语句。

IT利刃出鞘的博客 5093

5G时代必知:LDPC与Polar码实战解析(附MATLAB仿真代码)

本文深入解析5G时代核心信道编码技术LDPC码与Polar码的原理差异及性能表现,通过MATLAB仿真代码展示其在实际通信系统中的应用。LDPC码适用于大数据块高速传输,而Polar码在小数据块低时延场景表现优异,帮助开发者优化5G系统设计。

sugar的博客 643

YOLOv5实战:无人机巡检图片差异对比与违建标记(附完整代码)

本文详细介绍了如何利用YOLOv5目标检测技术实现无人机巡检图片差异对比与违建标记。通过图像对齐、目标检测、差异分析和可视化标记四个步骤,构建高效的违建识别系统,显著提升城市管理效率。文章包含完整代码实现和性能优化技巧,为计算机视觉在无人机巡检中的应用提供实用指南。

weixin_42535720的博客 282

数据幂等

在系统设计的时候,操作幂等设计是一点需要考虑的点。 幂等(idempotent、idempotence)是一个数学与计算机学概念,常见于抽象代数中。在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。 用数学表达式来表达的话: f(x) = f (f (x)) 1、数据库幂等 幂等性是后续多余的调用不会对系统数据的一致性进行破坏。在数据库操作...

carl.zhao的专栏 5237

高通平台Camera sensor bring up!

Qualcomm Camera sensor bring up!0. 准确1. Kernel 底层驱动配置1.1 dtsi1.2 pinctrl2. Chi-Cdk XML 配置2.1 sensormodule2.2 sensor3. CHECK 本文主要针对高通平台SM7250进行描述,当然高通平台可能基本都差不多【第一个项目】 —only for sensor probe sucess. 0....

Understand-image 9241

如何实现幂等性

幂等是一个数学与计算机学概念,在数学中某一元运算为幂等时,其作用在任一元素两次后会和其作用一次的结果相同。在计算机中编程中,一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。 幂等函数或幂等方法是指可以使用相同参数重复执行,并能获得相同结果的函数。这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。

charles0902的专栏 766

【深度学习新浪潮】近三年垂域大模型研究与产品进展全景洞察(2022-2025)

近三年来,垂域大模型完成了从技术探索到产业落地的关键跨越,在多个行业实现效率提升与价值创造。面对数据治理、技术适配、生态建设等挑战,未来需要通过技术创新、标准制定、人才培养等多维度发力,推动垂域大模型向更高效、更可靠、更普惠的方向发展。随着"人工智能+"行动的深入推进,垂域大模型将成为数字经济与实体经济深度融合的核心驱动力,为产业智能化升级注入持续动能。

专注:太空算力、AI infra、异构调度、大模型成本工程 786

【2026OD新机考】【不定滑窗】20260415-API请求日志去重分析【Py/Java/C++/C/JS/Go六种语言OD真题】【欧弟算法】全网注释最详细分类最全的华子OD真题题解

中找到所有的连续的相同元素,同时统计对应的连续相同元素对应的值的平均值。:当右指针为第一个元素(没有前一个元素),或者右指针对应的元素。某微服务系统的日志监控平台需分析API调用记录,日志含大量。相等,说明当前元素仍然属于同一个相同元素窗口,将当前元素值。中的所有元素均相等,并且计算窗口和情况即可。请实现一个函数,对给定的日志数据去重合并处理。位置,表示开启一个新的窗口,此时需要重置窗口和。,为了优化重复的请求记录,存储和后续分析需对。:对应的响应时间数组(毫秒)。重新置为当前右指针的元素值。

weixin_48157259的博客 112

五种方案解决幂等问题

方案一:数据库唯一主键实现幂等性 缺点:无法使用change buffer,InnoDB为了进行唯一性检查,必须有一次磁盘IO读页 方案二:业务状态校验 业务上根据业务ID的唯一性和业务处理的结果去做判断,但是这部分判断的逻辑需要考虑原子性。否则会因为并发问题导致幂等失效。解决途径一就是加锁,根据当前的服务环境选择单机或分布式锁。二是可采用现成方案Tomato,通过滑动窗口或者固定窗口拦截控制时间内的请求 方案三:数据库乐观锁实现幂等性 缺点:操作业务前,需要先查询出当前的versio

tom和cat的博客 7540

【已解决】飞牛nas(fnOS)异常断电导致硬盘未挂载(无法挂载),系统内部错误修复、救回数据全流程!(含更新系统后外接 NTFS 格式硬盘丢失的修复方法)

fnOS 飞牛NAS遭遇非正常断电后,存储空间显示「未挂载」或更新系统后外接 NTFS 格式硬盘丢失,点击挂载提示「系统内部错误」!💥 博主已经完美恢复,本文记录了相关的解决方案,帮您恢复或最大程度保住重要数据🎉

XiaoqiangClub的博客 2252

mysql事务保证幂等_使用数据库唯一键实现事务幂等性

幂等性概念在分布式系统中,幂等性是一致性方面的一个重要概念。幂等(idempotent、idempotence)是一个数学与计算机学概念,常见于抽象代数中。在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。所谓“影响相同”,不是要求返回值完全相同,而且是指后续多余的调用对系统的数据一致性不造成破坏。对于写入类操作,如果第一次写入是成功的,后续的写入应该抛出异常或者空操作...

weixin_30768881的博客 744

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

数据库新增幂等操作_使用数据库唯一键实现事务幂等性

幂等性概念在分布式系统中,幂等性是一致性方面的一个重要概念。幂等(idempotent、idempotence)是一个数学与计算机学概念,常见于抽象代数中。在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。所谓“影响相同”,不是要求返回值完全相同,而且是指后续多余的调用对系统的数据一致性不造成破坏。对于写入类操作,如果第一次写入是成功的,后续的写入应该抛出异常或者空操作...

weixin_39779537的博客 551

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

clickhouse 保证幂等性

使用引擎,结合参数避免数据重复插入。对查询操作天然幂等,无副作用。对分布式表使用数据去重和唯一标识符确保数据同步过程的幂等性。合理设计分区和数据处理批次,通过唯一标识符避免批处理任务的重复。通过这些机制,ClickHouse 能够在多种场景下提供幂等性保障,特别是在高可用分布式环境中。

goTsHgo的博客 1959

支付接口幂等性保证与高并发处理策略:实现稳定支付服务的关键

综上所述,实现接口幂等性需要综合考虑业务逻辑、数据一致性、系统性能和并发处理等多个方面。通过合理的设计和实现策略,可以有效地确保在高并发环境下接口的幂等性。接口幂等性是一个重要的概念,尤其在分布式系统和网络应用中,它意味着无论进行多少次操作,结果都保持一致。例如,在HTTP协议中,GET、HEAD、PUT、DELETE、OPTIONS和TRACE方法都被定义为幂等方法。通过以上步骤和策略,可以有效地保证支付接口的幂等性,并在高并发环境下实现稳定的支付服务。(sanzhiwa)后缀top。

夏壹分享 1211

数据库幂等性

数据库幂等性

zx733988的博客 861

分布式系统中的幂等性设计:消息去重、状态机与唯一键约束实践

分布式系统的幂等性设计不是单一技术方案的选择题,而是消息去重、状态机和唯一键约束的三层防线协同。幂等键解决"同一个请求不要执行两次",状态机解决"不合法状态不要执行操作",唯一键约束在数据库层面兜底。三层防线各有侧重,自上而下构成完整的幂等保障体系。创业团队在早期不需要实现全部三层,从唯一键约束和幂等键开始,随业务复杂度逐步引入状态机,是一条成本可控、风险可接受的建设路径。

qq_35160742的博客 4667

接口幂等性

接口幂等性接口幂等性什么是幂等性哪些情况需要防止什么情况需要幂等幂等性解决方案Token机制危险性各种锁机制数据库悲观锁数据库乐观锁业务层分布式锁各种唯一键约束数据库唯一约束Redis SET防重防重表全局唯一ID 接口幂等性 什么是幂等性 接口幂等性就是用户对同一操作发起的一次请求和多次请求结果是一致的,不会因为多次点击而产生了副作用,比如支付场景,用户购买了商品,支付扣款成功,但是返回结果的时候出现了网络异常,此时钱已经扣了,用户再次点击按钮,此时就会进行第二次扣款,返回结果成功,用户查询余额发现多扣钱

qq_45988496的博客 562

【防止重复下单】分布式系统接口幂等性实现方案

如订单支付后,seller要发货,发货完成后要填个快递单号。假设seller填个666,刚填完,发现填错了,赶紧再修改成888。对订单服务,这就是2个更新订单的请求。系统异常时666请求到了,单号更成666,接着888请求到了,单号又更新成888,但是666更新成功的响应丢了,调用方没收到成功响应,自动重试,再次发起666请求,单号又被更新成666了,这数据显然就错了!创建订单服务,可通过预生成订单号,然后利用DB的订单号唯一约束,避免重复写入订单,实现创建订单服务的幂等性。

JavaEdge全是干货的技术号 6880

幂等性深度解析:分布式系统的数据一致性基石

幂等性多次执行同一操作与执行一次的效果完全相同。无论操作被执行1次、10次还是100次,最终结果保持一致。fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;height:1em;幂等操作设置余额为90元第1次: 余额90第2次: 余额90第3次: 余额90非幂等操作扣减余额10元第1次: 余额90第2次: 余额80第3次: 余额70// 数学定义。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 2339

如何保证接口的幂等性?

幂等性(Idempotency)对同一个接口发起一次或多次相同请求,其结果完全一致,不会产生副作用。查询用户信息(GET) → 天然幂等取消一个“待支付”订单 → 成功后再次取消仍返回“已取消”,不报错扣减余额 10 元 → 调用两次就扣 20 元创建订单接口无去重 → 生成两个订单在分布式系统中,由于网络超时、客户端重试、消息重复投递等原因,幂等性不是“可选项”,而是“必选项”。保证接口幂等性,本质是“去重 + 状态判断”。创建类操作→ 用业务唯一键;状态变更→ 用状态机;表单提交。

Aerkui的博客 1874

实现接口幂等性的几种参考方案

实现接口幂等性的几种参考方案 下面的内容要是有不对的地方,麻烦私信我改掉哦。谢谢各位看官 一、单机幂等性 通过数据库索引字段的唯一性约束 数据库索引字段可设置唯一性约束,在插入数据的时候,如果索引字段重复,会返回23000 错误码,在web开发时,一般会报异常的,可统一拦截处理,返回请勿重复提交的友好响应。 下面多说一点哈 比如说普通的插入数据 员工表里有主键 员工编号 员工编号就是唯一的...

qq_41257365的博客 1524
下一篇: 分布式锁
U & Me
博客等级 码龄9年 3粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值