最近遇到一些简单并发问题的记录

1. 程序代码加锁,可以用JAVA.concurrent.包下的Lock类,比如营销系统的记账流水,详细可参见这块的代码...........

2. 清结算系统接口定时任务批量通知X变现更新用户的变现资产,同一个人多比变现会更新出现脏数据,采用行级索就能解决

<!-- 成功变现后更新用户的成功变现金额和成功变现后的剩余资产 -->
<update id="updateSuccedAssetsByFpOrderId" parameterType="com.***.***.p2p.domain.loan.BxdLoan" >
update bxd_mem_assert
set
succed_bx_money = succed_bx_money + #{bxMoney,jdbcType=DECIMAL},
succed_surplus_assets = succed_surplus_assets - #{bxMoney,jdbcType=DECIMAL} - #{bxInterests,jdbcType=DECIMAL},
update_time = now()
where fp_order_id = #{fpOrderId,jdbcType=VARCHAR}
</update>
<!-- 取消变现、流标/取消放款后的资金回退,恢复用户的变现前的变现金额和剩余资产 -->
<update id="updateRollbackAssetsByFpOrderId" parameterType="com.***.***.p2p.domain.loan.BxdLoan" >
update bxd_mem_assert
set
bx_money = bx_money - #{bxMoney,jdbcType=DECIMAL},
surplus_assets = surplus_assets + #{bxMoney,jdbcType=DECIMAL} + #{bxInterests,jdbcType=DECIMAL},
update_time = now()
where fp_order_id = #{fpOrderId,jdbcType=VARCHAR}
and bx_money > 0
</update>

3.借款人在点取消变现的同时,用户在产品详情页点了下单按钮,主要是前端页面停顿到提交到后台业务逻辑处理的时差问题导致的。需要双向控制:
1)在更新变现单状态为‘已取消’时,需要先检测是否存在订单,采用update status where exists select order
2)在用户下单的后台逻辑里,要先检查是否用户已经取消了变现,即此产品是否还处于在售中的状态,虽然用户一开始看到的是在售中,通过此状态链接进入了购买页面,但是下单之前可能已经被改掉了。

<!--
取消变现: 更新产品状态为:已取消,程序后续还要更新变现单状态为“取消变现”
通过行级索方式控制
可取消条件:在售中的变现单、且此变现单不存在有效地投资的订单(除状态为3交易取消,8交易关闭之外的订单都认为为有效订单)
-->
<update id="updateForCancelByProductId" parameterType="java.lang.String" >
UPDATE
bxd_prd_base prd
SET
prd.status_code = ‘12‘,
prd.status_value = ‘已取消‘
WHERE EXISTS
( SELECT
bl.loan_id FROM bxd_loan bl
WHERE bl.del_flag = 0
AND bl.loan_id = #{productId,jdbcType=VARCHAR}
AND bl.status_code = 1
AND bl.loan_id = prd.product_id
AND NOT EXISTS
(SELECT
bod.product_id
FROM
bxd_ord_detail bod
WHERE bl.loan_id = bod.product_id
AND bod.status_code NOT IN (3, 8))
)
</update>

4. XXX宝申购,或者前台表单提交没有防重,或者由于网络的问题,导致一个请求到后台变成了2此接口请请求 ,导入用户一个x变现订单同时申购了两次。
解决办法:
1) 前端:加上防重机制:如var submitLock=false;,并且如果是$.ajax的话,设置成同步,不要异步!
2) 后端:控制器通过Token控制
3) 数据库层每次insert前都要确保没有相同的流水插入过,通过在流水号字段加唯一索引,保证同一个业务只插一条记录,并且根据insert的返回值进行下一步操作!或者直接通过下面的语句:

INSERT INTO `bxd_tnb_trade_wait` (`account_no`, `order_id`, `trade_money`, `status_code`, `record_count`, `add_time`, `update_time`, `del_flag`)
SELECT ‘6976870‘,‘601000284‘,‘9999999‘,‘9‘,‘9‘,‘20169-09-19 19:59:09‘,‘2019-09-19 19:59:09‘,‘0‘ FROM DUAL
WHERE NOT EXISTS (SELECT order_id FROM bxd_tnb_trade_wait WHERE order_id=‘601000233‘)
时间: 2024-08-29 16:51:14

最近遇到一些简单并发问题的记录的相关文章

简单搭建syslog-ng server记录log

### 简单搭建syslog-ng server记录log 安装syslog-ng apt-get install syslog-ng 安装syslog-ng 配置syslog-ng vim /etc/syslog-ng/syslog-ng.conf 配置可以参考如下: @version: 3.5 @include "scl.conf" @include "`scl-root`/system/tty10.conf" options { time-reap(30);

简单高效的分块记录的实现

在定长记录采用数据库读写并非最佳解决方案一文中,介绍了不管文件中记录数据为多少,只要按照文中介绍的方法存储,对于文件中任意1条记录数据,在读缓冲内存恒定不变的情况下,最多只需要读文件1次,而且定位记录的算法也超级简单,只需做1次除法运算和1次求余运算.今天我在这里介绍一下它的C++实现方法. 1.写记录 [cpp] view plain copy #ifndef _WRITE_RECORD_H #define _WRITE_RECORD_H #include <qglobal.h> #incl

Shell命令学习 之,sort,unique 文件简单排序去除重复记录

经常会碰到文件里有重复记录的场景,要么去除重复记录,要么统计下重复记录数,这些简单的功能可以通过shell命令里的sort,uniq组合实现, 比如文件a.txt记录如下 test,test1,test2 test test1 test2 test,test1,test2 abcd edfg abcd ddddd 去除重复行: sort a.txt |uniq abcd ddddd edfg test test,test1,test2 test1 test2 查找非重复行 [[email pro

上账务系统余额并发更新问题记录

某电商平台,某天线上用户报bug说账户余额信息与交易流水对不上.可以认为是数据库并发更新问题,由此定位出具体原因,并给出解决方案. 问题现象 场景描述 线上账务系统,在定时结算给卖家钱时,且高并发量的情况下,出现提现x元(假设当前用户余额为x元)余额为0后,再转入该账户一笔钱(假设为y元),结果账户余额变为了x+y 元,导致用户余额错误. ps:账户余额的变更都是在事务中update的 环境说明 mysql5.7 + innodb,事务隔离级别是REPEATABLE-READ 场景模拟 我们简化

并发编程学习记录

重要知识点 现代系统基本的构造并发程序的方法 进程:用这个方法,每个逻辑流都是一个进程,由内核来调度和维护.因为进程有独立的虚拟地址空间,想要和其他流通信,控制流必须使用某种显式的进程间通信机制. I/O多路复用:在这种形式的并发编程中,应用程序在一个进程的上下文中显示地调度它们自己的逻辑流.逻辑流被模型化为状态机,数据到达文件描述符后,主程序显示地从一个状态转化到另一个状态.因为程序是一个单独的进程,所以所用流共享同一个地址空间. 线程:线程是运行在一个单一进程上下文中的逻辑流,由内核进行调度

做一个简单下载功能的记录

给同事做一个下载的功能,将数据库关联查询后生产csv文件供下载,期间遇到的小问题,记录下. 1,数据库的关联查询 查询出来的数据结构是:一个表TABLE_A的部分数据,和TABLE_A的每条数据在TABLE_B表中的个数 mapper.xml文件 sql语句(下面的方式可能会引发一些问题,下面讲) <resultMap id="aAndCount" type="com.model.AandCount"> <result column="f

imooc课程:Java高并发秒杀API 记录

Java高并发秒杀API之业务分析与DAO层 Java高并发秒杀API之Service层 Java高并发秒杀API之web层 Java高并发秒杀API之高并发优化 除了并发部分外的这个web开发的总结:https://www.imooc.com/video/11737 springmvc运行流程 BOOTSTRAP 和 JS 的使用技巧.(模块化.不混乱.抽取字典方便修改) JQ插件(countDown && cookie 等) 原文地址:https://www.cnblogs.com/a

js封装、简单实例源码记录

1.运动封装:doMove ( obj, attr, dir, target, endFn )  加入回调.&&.||用法注释 <script> var oBtn1 = document.getElementById('btn1'); var oDiv = document.getElementById('div1'); oBtn1.onclick = function () { // doMove ( oDiv, 'width', 34, 600 ); doMove ( oD

jquery简单笔记(1) - 基础记录

一.dom对象及jquery对象相互转换 jquery对象转换成dom对象,即 [index] 和 get(index) 第一种方式: var $j = $('#id'); // jquery对象 var j = $j[0]; // dom对象 第二种方式: var $j = $('#id'); // jquery对象 var j = $j.get(0); // dom对象 二.jquery库与其他库的冲突 1. jquery库在其他库之后导入 第一种:使用 jQuery.noConflict(