分布式下引发的并发问题

刍荛采葑菲 刍荛采葑菲     2022-10-21     553

关键词:




情景一:
客户端超时时间(CT)小于服务端超时时间(ST)。【调整时间大小】

当客户端调用服务端向数据库发起请求时,假如是个大数据量提交,
假如客户端超时时间为10s,服务端超时时间为15s
当提交等待时间为12s时,客户端已经返回错误,而服务端未超时。
最后12s后服务端提交成功。而客户端返回失败。


情景二:
1、分布式锁超时时间小于业务超时时间【调整时间大小】
2、数据库里相关字段没有唯一索引【增加唯一幂等性验证】

那么如果线程A提交的数据出现问题(如大数据提交等),处于等待状态,并获得分布式锁。
而线程B、C...也来提交,由于分布式锁,访问被拦截。
当分布式锁超时时间结束时,线程Z刚好提交。
如果数据库缺少唯一性索引,此时线程A与线程Z可能同时提交成功。


情景三:
1、分布式锁超时时间小于业务超时时间【调整时间大小】
2、业务有重试机制
3、数据库里相关字段没有唯一索引【增加唯一幂等性验证】

(1)由于数据库连接数被占满,流水 1 创建的事务处于等待提交状态。
(2)系统 A 发现交易失败,重试次数不满 8 次的,立即发起重试,触发生成流水
2 的请求。
(3)5s 以内数据均被分布式锁拦截,无法提交。
(4)经过 5s 后,系统 B 的分布式锁失效,此时事务仍在等待未提交。
(5)6s 时,流水 2 成功越过数据库查询幂等校验发起事务,此时流水 1 拿到数
据库连接,流水 1 和 2 两个事务同时提交。
(6)由于数据库未做唯一索引,且支付受理模块打穿下层幂等原则,生成 2 个
TXID,导致两事务同时提交成功。
(7)收益结转重复记账,用户多了一笔收入。

得出一个结论:分布式锁在以下条件同时满足的情况下并发控制会被打穿。
(1)上层业务系统层面有重试机制。
(2)业务请求存在一定时间之后提交成功的情况,例如本例中第一次请求在事务
等待 6s 后获得了数据库链接,提交数据库成功。
(3)下游系统缺乏其他有效的幂等控制手段

分布式环境下的并发编程(代码片段)

...线程编程中,经常会用到synchronized、lock和原子变量等,分布式系统中,由于分布式系统的分布性,即多线程和多进程并且分布在不同机器中,synchronized和lock这两种锁将失去原有锁的效果,需要我们自己实现分布式锁来处理并发... 查看详情

高并发高并发分布式锁架构解密,不是所有的锁都是分布式锁!!(代码片段)

...近,很多小伙伴留言说,在学习高并发编程时,不太明白分布式锁是用来解决什么问题的,还有不少小伙伴甚至连分布式锁是什么都不太明白。明明在生产环境上使用了自己开发的分布式锁,为什么还会出现问题呢?同样的程序... 查看详情

并发场景下的幂等问题——分布式锁详解(代码片段)

...加人业务场景对数据库幂等问题进行了简单分析,就分布式锁实现幂等方法展开了详细讨论。分析了锁在分布式场景下存在的问题,包括单点故障、网络超时、错误释放他人锁、提前释放锁以及分布式锁单点故障等,... 查看详情

分布式问题

...:中华石杉公众号和B站视频;高并发、高可用设计 分布式ID:1)生成方式有几种,优缺点对比;UUID/snowFlake/   分布式缓存:1)缓存架构?2)Redis,AOP、cluster方案3)真正支撑高并发及高可用的复杂系统中缓存架... 查看详情

高并发场景之rabbitmq

...Redis队列也不能完全解决问题,因为使用Redis要自己实现分布式锁 这次我们来了解一下一个专门处理队列的组件:RabbitMQ,这个东西天生支持分布式队列。下面我们来用Ra 查看详情

高并发场景之rabbitmq篇

...Redis队列也不能完全解决问题,因为使用Redis要自己实现分布式锁 这次我们来了解一下一个专门处理队列的组件:RabbitMQ,这个东西天生支持分布式队列。下面我们来用RabbitMQ来实现上一篇的场 查看详情

并发问题

...。并发主要为多任务情况设计。但如果应用不当,可能会引发一些漏洞。按照情况不同,可以分为三种:竞态条件:由于多进程之间的竞争执行,导致程序未按照期望的顺序输出。死锁:并发程序等待一些 查看详情

巧用cas解决数据一致性问题

缘起:在高并发的分布式环境下,对于数据的查询与修改容易引发一致性问题,本文将分享一种非常简单但有效的优化方法。 一、业务场景业务场景为,购买商品的过程要对余额进行查询与修改,大致的业务流程如下:(1... 查看详情

jmeter实现分布式并发

...来承担负载压力。接下来我们就来看一下如何实现jmeter的分布式并发:需要在负载机上配置jdk环境和jmeter环境首先我们需要准备一个负载机,本次演示的负载机是博主在虚拟机上搭建的一个Linux服务器,Linux系统需要安装jdk(不... 查看详情

高并发由interruptedexception异常引发的思考(代码片段)

写在前面InterruptedException异常可能没你想的那么简单!前言当我们在调用Java对象的wait()方法或者线程的sleep()方法时,需要捕获并处理InterruptedException异常。如果我们对InterruptedException异常处理不当,则会发生我们意想... 查看详情

高并发由interruptedexception异常引发的思考(代码片段)

写在前面InterruptedException异常可能没你想的那么简单!前言当我们在调用Java对象的wait()方法或者线程的sleep()方法时,需要捕获并处理InterruptedException异常。如果我们对InterruptedException异常处理不当,则会发生我们意想... 查看详情

高并发由interruptedexception异常引发的思考(代码片段)

写在前面InterruptedException异常可能没你想的那么简单!前言当我们在调用Java对象的wait()方法或者线程的sleep()方法时,需要捕获并处理InterruptedException异常。如果我们对InterruptedException异常处理不当,则会发生我们意想... 查看详情

分布式锁那点事

为什么需要使用分布式锁为了保证同一个方法在高并非情况下的同一时间只能被一个线程执行,在传统单体应用单机部署的情况下,可以使用java并发处理的api(如Reentrantlock和synchronized)进行互斥控制,但是,随着业务发展的需... 查看详情

并发高?可能是编译优化引发有序性问题(代码片段)

摘要:CPU为了对程序进行优化,会对程序的指令进行重排序,此时程序的执行顺序和代码的编写顺序不一定一致,这就可能会引起有序性问题。本文分享自华为云社区《【高并发】解密导致并发问题的第三个幕后... 查看详情

[转]静态资源的分布对网站加载速度的影响/浏览器对同一域名下并发加载资源数量

...资源的分布对网站加载速度的影响/浏览器对同一域名下并发加载资源数量/browsersnetwork-http-persistent-max-connections-per-server引文:浏览器在同一个域名下并发加载的资源数量是有限的,访问淘宝首页需要加载126个资源,那么如此小的... 查看详情

重学springboot系列之整合数据库开发框架---下(代码片段)

...ingboot系列之整合数据库开发框架---下mybatis+atomikos实现分布式事务整合jta-atomikos配置多数据源统一事务管理器service层测试mybatisplus+atomikos实现分布式事务遗留问题整合jta-atomikos配置多数据源(调整)Spring事务与分布... 查看详情

redis分布式队列解决文件并发的问题

1.首先将捕获的异常写到Redis的队列中1publicclassMyExceptionAttribute:HandleErrorAttribute2{3publicstaticIRedisClientsManagerclientManager=newPooledRedisClientManager(newstring[]{"127.0.0.1:6379","192.168.1.2:6379"}) 查看详情

windows多线程开发之并发线程程序研究

做为一名分布式服务器开发人员,在服务器开发领域、多线程开发和并发编程方面有自己的心得和经验,愿意分享给同仁,今讨论下Windows下线程并发程序开发。下面用用两个线程实现一个简单的数组排序,演示了线程的基本用... 查看详情