基础篇(一)幂等性

什么是幂等性?如何解决幂等性问题? 本文讲解了什么是幂等性、幂等性的场景以及如何解决幂等性问题 阅读详情


1、导语
我认为我是个懒惰的人,很少去写点什么东西,哪怕是看书,我也从来没有看完过一本书。我买过不少书籍,但是几乎每本书籍都没有看完三分之一,一个是因为我懒惰,其次是一本书对于我来说有效信息量可能不足20%甚至更低,我需要去筛选一些我感兴趣的或者说对我来说有用的片段,这使得我失去去翻它的兴趣。我几乎所有的能力都学习于互联网,感谢那些乐于分享自己心得的同仁。终于下定决心,自己去写一些什么东西回报一下,力求有效信息量超过60%,写一些对读者有用,读者愿意看下去的东西。

罗里吧嗦了半天,开始进入正题吧,这是我将写下的第一篇博客,幂等性。之所以开篇就写幂等性,是因为我认为幂等性是架构设计中的基础中的基础。,没法保证幂等性,咱们接下来没法谈数据一致性与事物完整性了。

2、什么是幂等性
抄用一段数学上的定义:f(f(x)) = f(x)。x被函数f作用一次和作用无限次的结果是一样的。幂等性应用在软件系统中,我把它简单定义为:某个函数或者某个接口使用相同参数调用一次或者无限次,其造成的后果是一样的,在实际应用中一般针对于接口进行幂等性设计。举个栗子,在系统中,调用方A调用系统B的接口进行用户的扣费操作时,由于网络不稳定,A重试了N次该请求,那么不管B是否接收到多少次请求,都应该保证只会扣除该用户一次费用。

3、幂等性设计
幂等性一般应用于协议设计,TCP协议支持幂等吗?答案是肯定的,在网络不稳定时,操作系统可以肆无忌惮的重发TCP报文片段。TCP协议能够保证幂等的核心在于sequence number字段,一个序列号的在较长的一段时间内均不会出现重复。对于应用层的协议设计,原理和TCP是类似的,我们需要一个不重复的序列号。再简单一点说,在一个业务流程的处理中,我们需要一个不重复的业务流水号,以保证幂等性。

举个实际应用场景:用户A在网页上发起一笔游戏充值请求,浏览器引导用户去银行支付,支付成功后系统给用户进行充值。

协议设计上,我们通过全局唯一的充值订单号贯穿整个业务流程,使该业务支持幂等。

应用实现上,我们列举在银行支付成功后回调系统,进行充值的步骤进行说明。

func pay_notify(orderid,value,state){//有问题的实现
         order = db.query("select * from payorder where orderid=$orderid");
         check(order,orderid,value,state);//判断支付金额是否与订单金额一致,判断是否是支付成功回调。
         if(order.state=='未支付'){
            db.update("update payorder set state='已支付' where orderid=$orderid");
            charge(order.username,value);//执行充值
         }else{
         return result("订单已处理")//返回订单已处理,或者返回处理成功
        }
    }


上述实现的问题在于,当回调出现并发时,order.state已经是脏读了,有可能重复充值,该实现并不能100%保证幂等。
列举三种改进方式:
1、悲观锁,select for update,整个执行过程中锁定该订单对应的记录。
2、乐观锁,affectrows = db.update("update payorder set state='已支付' where orderid=$orderid and state='未支付' "),如果affectrows=1,执行充值,否则返回已处理。

3、定义notifylog表,orderid为unique key或者primary key,执行前,先insert,若insert成功则执行充值,否则返回已处理。
以上简单例子用以说明幂等性常用应用实现,在SOA化系统中,可能很多原子功能都被拆分到不同的进程里,如charge充值这个函数,可能在另一个进程中,那么整个业务的链路就会更长,可能回调成功了,但是充值失败。同理,只要充值接口保证幂等性,对于已经回调过但是充值结果未返回的请求,回调接收程序,应当重复发起充值请求。更深入更复杂的应用场景,在数据一致性中再细讲。

4、总结
业务层设计协议时,要求请求方定义不重复的业务流水号。应用实现时,利用数据库乐观锁、插入unique key的日志等方式保证并发时的幂等。
幂等性把关环节,在协议设计评审中,评审重要业务RPC或者http接口是否支持幂等,代码评审中,重点把关请求并发时,是否仍旧能够保证幂等性。设计人员和具体实现人员在实现过程中,也应该时刻自审幂等性的实现是否过关。

————————————————
版权声明:本文为优快云博主「司马晨风」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/tjgamejx2/article/details/51011425

用 CL_SALV_TREE 把层级数据做成一棵会呼吸的 ABAP ALV 树:从类继承扫描到事件交互的完整拆解 本文介绍了SAP ABAP中使用CL_SALV_TREE实现树形ALV报表的方法。该技术将层级数据(如类继承关系)以可展开/折叠的树形结构展示,解决了传统ALV Grid无法直观显示层次结构的问题。核心实现采用"数据表+层级表"分离的设计模式:数据表存储节点业务信息,层级表维护父子关系。通过add_node方法动态构建树形结构,支持设置节点文本、图标和事件。文中提供了完整示例代码,演示了如何递归扫描ABAP类继承关系并构建树形ALV,这种技术特别适用于展示类族谱、权限树等层级数据,能显著 阅读详情

相关推荐

时序SDC约束set_data_check及常见应用场景

时序约束SDC之set_data_check命令及常见应用场景解析

weixin_37584728的博客 2287

幂等性 详解

幂等性 详解

T_Y_F_的博客 1067

SAP-MM-PR分配货源并转PO

SAP-MM-PR分配货源并转PO

yanzibing99的博客 5473

幂等性(等幂性) 个人理解及应用【转】

https://blog.youkuaiyun.com/g11d111/article/details/72916825

无人境域 3055

室内无人机自主定位:融合Mid360激光雷达与光流传感器的无GPS导航实践

本文详细介绍了室内无人机自主定位技术,通过融合Mid360激光雷达与光流传感器实现无GPS导航。文章分析了技术挑战、硬件配置、算法优化及实战调试,展示了在复杂室内环境中如何实现厘米级定位精度,为仓库巡检、隧道勘测等场景提供可靠解决方案。

weixin_30500105的博客 532

多尺度变换(Multidimensional Scaling ,MDS)详解

介绍多尺度变换基本原理

5215

离散数学第五章 代数结构

离散数学第五章 代数结构 5-1 代数系统的引入 定义1:对于集合A,一个从Aⁿ到B的映射,称为集合A上的一个n元运算。如果B⊆A,则称该n元运算是封闭的。 定义2:一个非空集合A连同若干个定义在该集合上的运算f₁,f₂,…,f(n)所组成的系统就称为一个代数系统,记作<A,f₁,f₂,…,f(n)> 5-2运算及其性质 一些性质 封闭性:设*是定义在集合A上的二元运算,如果对于任意的x,y∈A,都有x * y∈A,则称二元运算 * 在A上是封闭的。 可交换性:设*是定义在集合A上的二元运算

m0_56150664的博客 6209

LVGL开发新选择:深度对比NXP GUI Guider与SquareLine Studio,免费版够用吗?

本文深度对比了LVGL开发中两款主流工具NXP GUI Guider与SquareLine Studio的核心差异,包括功能定位、设计能力、代码生成质量和硬件适配等方面。针对不同项目需求,分析了免费版工具的适用性,帮助开发者根据预算和功能需求做出明智选择。特别关注了GUI设计工具在嵌入式开发中的实际应用效果。

weixin_26976635的博客 429

什么是接口的幂等性以及如何实现接口幂等性

目录 1、接口调用存在的问题 2、什么是接口的幂等性 3、不做接口的幂等性会产生什么影响 4、什么情况下需要保证接口的幂等性 4.1 select:查询操作 4.2 insert:新增操作 4.3 delete:删除操作 4.3.1 绝对删除 具有幂等性 4.3.2 相对删除 不具有幂等性 4.4 update:更新操作 4.4.1 绝对更新 具有幂等性 4.4.2 相对更新 不具有幂等性 5、使用幂等的业务场景 5.1 前端重复提交 5.2 接口超时重试 5.3 MQ消息重

风暴计划 9714

【人工智能】Open WebUI 安装指南 ( 基于Docker下载和使用Open WebUI 、通过本地运行项目源码进行搭建Open WebUI)

Open WebUI 是一个可扩展、功能丰富且用户友好的自托管 WebUI,旨在完全离线操作。它支持各种 LLM 运行程序,包括 Ollama 和 OpenAI 兼容的 API。社区:https://openwebui.com/

奶爸的编程之路,也就一周冷个三天 2万+

手把手教你学simulink(26.8)--控制算法场景示例:基于强化学习的无人机姿态稳定控制系统

首先,我们需要定义无人机的姿态稳定控制环境。环境包括无人机的状态(姿态角、角速度等)和动作(电机转速)。我们还需要定义奖励函数,用于评估控制器的表现。matlab深色版本% 定义环境% 定义状态空间% 12个状态变量% 定义动作空间% 电机转速范围奖励函数用于评估控制器的表现。我们可以根据无人机的姿态误差、角速度误差以及控制输入的变化率来设计奖励函数。具体来说,当无人机的姿态接近设定值时,给予正奖励;当姿态误差较大或控制输入变化剧烈时,给予负奖励。matlab深色版本。

MHD0815的博客 496

幂等性测试,零基础入门到精通,收藏这篇就够了

幂等性(idempotence)是一个数学和计算机学概念,指的是对于同一操作,无论是一次还是多次执行,产生的结果是一致的,不会因为多次执行而产生副作用。在编程中,幂等操作是指可以使用相同参数重复执行,对系统产生的影响是一样的,即对资源的作用是一样的,不会发生副作用。

leah126的博客 1645

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

JAVA-幂等性(一):http幂等性

一、什么是幂等性?什么是幂等操作? 幂等:是一个数学概念,表示N次变换和1次变换的结果相同。 幂等操作:其特点是任意多次执行所产生的影响均与一次执行的影响相同(不会改变资源状态,对数据没有副作用)。 幂等性:一系列操作都是幂等操作。 幂等接口:幂等接口认为,外部调用者会存在多次调用的场景,为了防止重试对数据状态的改变,需要将接口的设计为幂等的 HTTP方法的幂等性是指一次和多次请求某一个...

休憩小屋 5206

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

幂等性详解

幂等性是一个数学和计算机科学中的重要概念。简单来说,幂等性是指执行一次和执行多次的效果是一样的操作特性。用数学语言表达就是:如果一个操作执行多次所产生的影响与执行一次的影响相同,那么这个操作就是幂等的。对于函数 f 来说,如果 f(f(x)) = f(x),那么函数 f 就是幂等的。绝对值函数 abs(x) 是幂等的,因为 abs(abs(x)) = abs(x)求最大值函数 max(x, a) 是幂等的,因为 max(max(x, a), a) = max(x, a)

yk_dflkg的博客 2215

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

幂等性

什么是幂等性 就是对资源的操作,无论操作一次还是多次,其资源本身不发生变化。 幂等性设计其实是分布式中十分重要的概念 比如表单重复提交是一个典型的需要进行幂等性设计的一个问题。 需要幂等的场景 网络波动: 因网络波动,可能会引起重复请求 分布式消息消费: 任务发布后,使用分布式消息服务来进行消费。 用户重复操作: 用户在使用产品时,可能会误操作而触发多笔交易,或者因为长时间...

kun blog 1万+

支付幂等性的实现中,通过“一锁、二判、三更新”

加锁确保了同一业务单号在并发情况下的唯一性操作。幂等性判断避免了重复生成支付单。数据更新确保了新生成的支付链接能正确返回并持久化。这种设计有效地防止了重复支付操作,并确保了系统的可靠性和数据的一致性。支付幂等性是指在支付系统中,无论同一个支付请求被重复调用多少次,结果都应该是相同的,并且不会导致重复支付或数据不一致的问题。即在网络请求可能被多次触发的情况下,确保同一笔支付请求仅会成功一次,不会因为系统的重试或用户的重复点击而多次扣款或生成多个支付订单。

鱼干的博客 1303

什么是接口的幂等性,如何保证接口的幂等性?

大家好,我是Leo哥🫣🫣🫣,有半个月没更新了,最近都忙着工作跟其他事情,博客水都没时间水了。这不年前几天,没啥任务了,昨天看了下关于幂等性的一些问题,今天早上抽空写了篇博客,分享给大家。好了,话不多说让我们开始吧😎😎😎。幂等是一个数学与计算机学概念,在数学中某一元运算为幂等时,其作用在任一元素两次后会和其作用一次的结果相同。在计算机中编程中,一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数或幂等方法是指可以使用相同参数重复执行,并能获得相同结果的函数。

分享思想,留下痕迹。 2025

什么是幂等性?如何实现幂等性

目录 一、什么是幂等性 二、什么是接口幂等性 三、为什么需要实现幂等性 四、引入幂等性后对系统的影响 五、Restful API 接口的幂等性 六、如何实现幂等性 方案一:数据库唯一主键 方案二:数据库乐观锁 方案三:防重 Token 令牌 方案四、下游传递唯一序列号 七、实现接口幂等示例 1、Maven 引入相关依赖 2、配置连接 Redis 的参数 3、创建与验证 Token 工具类 4、创建测试的 Controller 类 5、创建 SpringBoot 启动类 .

小喵的博客 7157

最系统的幂等性方案:一锁二判三更新

所谓幂等性,就是一次操作和多次操作同一个资源,所产生的影响均与一次操作的影响相同。"幂等(idempotent、idempotence)是一个数学与计算机学概念,常见于抽象代数中。幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数。幂等(idempotent、idempotence)是一个数学与计算机学概念,常见于抽象代数中。幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数。这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。

架构师尼恩 3660

幂等性(一)

幂等性是指一个操作无论执行一次还是多次,其结果都保持一致,且不会产生副作用。这一概念在计算机科学中广泛应用于HTTP方法、API设计、分布式系统和消息队列等领域。HTTP方法中,GET、HEAD、PUT和DELETE是幂等的,而POST和PATCH则不是。幂等性在API设计、分布式系统和微服务架构中尤为重要,确保客户端可以安全地重试请求而不造成数据错误或业务异常。实现幂等性的方法包括使用唯一标识与缓存、数据库唯一索引、乐观锁和Token校验等。设计时需注意不要滥用幂等性,结合业务逻辑,并记录日志以便排查问题

红血哥 947

【概念篇】嘛是幂等性?

【引言】 今天被问到一个问题,数据库中哪些操作具有幂等性。恩?当时听了很迷瞪,平时管理数据库,一些操作也没碰到幂等性这个说法啊。鉴于此,今天学习下幂等性是个嘛?! 【大纲】 1.幂等性是个啥? 2.幂等性有什么用? 3.怎样保证幂等性? 4.幂等性有啥不足? 一、嘛是幂等性? 幂等(idempotent)是一个数学与计算机学概念,常见于抽象代数中。 幂等函数,或幂等方法,是指可以使用相同参数重复执...

db_murphy的博客 717

什么是幂等性、幂等性解决方案

一、什么是幂等性 幂等性是一个技术术语、类似鉴权、都有一堆的解决方案 二、什么情况需要幂等 业务开发中,经常会遇到重复提交的情况,无论是由于网络问题无法收到请求结果而重新发起请求,或是前端的操作抖动而造成重复提交情况。 用户在APP上连续点击了多次提交订单,后台应该只产生一个订单; 向支付宝发起支付请求,由于网络问题或系统BUG重发,支付宝应该只扣一次钱。很显然,声明幂等的服务认为,外部调用者会存在多次调用的情况,为了防止外部多次调用对系统数据状态的发生多次改变,将服务设计成幂等。 .

Ly 4303
上一篇: 在Linux上安装Python3
下一篇: 数据库悲观锁和乐观锁
javaee1234
博客等级 码龄10年 49粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值