核心记账业务可用jdk7的PriorityBlockingQueue优先阻塞队列结合乐观锁实现
-- 1、优先级阻塞队列
当前核心记账业务是悲观锁实现,但考虑到高并发和死锁的问题,可以用PriorityBlockingQueue优先阻塞队列结合乐观锁实现,对于并发时出现锁无法update时可以重新进入队列并调整优先级进行记账处理。
新方案:乐观锁:PriorityBlockingQueue<T> 优先级队列串行化记账请求,乐观锁处理账户表相关的数据一致性问题,当数据不一致时将优先级调整再次进入记账队列。
PriorityBlockingQueue是无界队列,与缓存线程池一样,使用时要千万注意控制,不然很容易消耗系统所有资源导致崩溃。
老方案:悲观锁: 更改账户表余额update语句:update t_account set amount = amount - quantity where amount >= quantity and ID = 12345
1、记流水,2、加减单边主账户余额(悲观锁),3、更新流水(主账户记账成功),4、异步请求处理完成单边账,更新流水状态,更新会计流水
--- 2、热点账户
账务系统会因为复式记账法业务而在交易到达一定数量级后成为热点,所以从交易流水就应该和账务核心分开,交易流水和单式记账作为一个层次,然后再请求账务核心和会计核心。这样也就缓冲了热点,后面分开的会计引擎,且调单边账的功能不能少了。
个人账户=资产,余额方向和发生方向都应该是双方,在余额变动时通过操作层面来判断。也可以设计成一方且不可红字,也可以设计成双方共同反应,同时有借方余额和贷方余额,只是在余额更新的时候多加条件判断,防止红字。(◎﹏◎) 综合还是共同反应比较好,余额字段保留,不过需要作为被动触发计算的字段,不会实时更新。
猜测:1、针对需要调银行网关的交易,调用网关实现交易后直接insert成功的单边流水,如果失败则insert失败的流水。
2、针对不调银行网关直接用账户余额的交易,则用带锁的update实现余额变动,成功后需要插入成功状态的流水,不成功则插入失败的流水。
流水插入失败必要回滚余额变动的update语句。这样做还有一个前提就是已开户且激活的有效用户。
注意:在2中不再是insert流水再等业务处理完毕update流水。
核心记账业务可用jdk7的PriorityBlockingQueue优先阻塞队列结合乐观锁实现的更多相关文章
- 并发新构件之PriorityBlockingQueue:优先阻塞队列
PriorityBlockingQueue:优先阻塞队列:是带有优先级的阻塞队列,一个无界阻塞队列,它使用与类 PriorityQueue 相同的顺序规则,并且提供了阻塞获取操作.虽然此队列逻辑上是无 ...
- Java并发包源码学习系列:阻塞队列实现之PriorityBlockingQueue源码解析
目录 PriorityBlockingQueue概述 类图结构及重要字段 什么是二叉堆 堆的基本操作 向上调整void up(int u) 向下调整void down(int u) 构造器 扩容方法t ...
- Java并发之BlockingQueue 阻塞队列(ArrayBlockingQueue、LinkedBlockingQueue、DelayQueue、PriorityBlockingQueue、SynchronousQueue)
package com.thread.test.thread; import java.util.Random; import java.util.concurrent.*; /** * Create ...
- Java核心知识点学习----多线程中的阻塞队列,ArrayBlockingQueue介绍
1.什么是阻塞队列? 所谓队列,遵循的是先进先出原则(FIFO),阻塞队列,即是数据共享时,A在写数据时,B想读同一数据,那么就将发生阻塞了. 看一下线程的四种状态,首先是新创建一个线程,然后,通过s ...
- java PriorityBlockingQueue 基于优先级队列,的读出操作可以阻止.
java PriorityBlockingQueue 基于优先级队列.的读出操作可以阻止. package org.rui.thread.newc; import java.util.ArrayLis ...
- 并发编程-concurrent指南-阻塞队列-优先级的阻塞队列PriorityBlockingQueue
PriorityBlockingQueue是一个支持优先级的无界阻塞队列. 它使用了和类 java.util.PriorityQueue 一样的排序规则.你无法向这个队列中插入 null 值. 所有插 ...
- JUC 并发编程--09, 阻塞队列: DelayQueue, PriorityBlockingQueue ,SynchronousQueue, 定时任务线程池: ScheduledThreadPoolExecutor
先看DelayQueue 这个是用优先级队列实现的无界限的延迟队列,直接上代码: /** * 这个是 {@link DelayQueue} 延时队列 的验证使用类 */ class MyDelayed ...
- 【iCore4 双核心板_uC/OS-II】例程九:消息队列
一.实验说明: 前面介绍通过信息传递可以进行任务间的交流,信息也可以直接发送给一个任务,在uC/OS-II中每一个任务在它们内部都有一个消息队列,也即任务消息队列,用户可以直接给一个任务发送消息,不需 ...
- Redis分布式锁实现秒杀业务(乐观锁、悲观锁)
https://blog.csdn.net/lmb55/article/details/78266905
随机推荐
- STM32 TIM高级定时器死区时间的计算
STM32 TIM高级定时器的互补PWM支持插入死区时间,本文将介绍如何计算以及配置正确的死区时间. 文章目录 什么是死区时间? 数据手册的参数 如何计算合理的死区时间? STM32中配置死区时间 什 ...
- .NET分离exe和dll在不同的目录让你的程序更整洁
1.引言 在一个项目开发中一般都是把引用的dll放在根目录下,随着项目的日益增大,根目录下的dll文件就会越来越多,合理规划这些dll的存放地址,可以使整个项目更加的规范与美观.这篇文章就为大家介绍关 ...
- 初探Redis-基础类型Hash
Redis存在五种基础类型:字符串(String).队列(List).哈希(Hash).集合(Set).有序集合(Sorted Set).本次列举出Hash的常用操作. Redis官网:https:/ ...
- 设计模式之GOF23外观模式
外观模式 迪米特原则:一个软件实体应当尽可能少的与其他实体发生相互作用 外观模式核心:为子系统提供统一的入口,封装子系统的复杂性,便于客户端调用 相当于找了个代理帮你做了所有事而你只需要和代理打交道
- [带符号大整数模板]vector版
#include <iostream> #include <cstdio> #include <vector> #include <cstring> u ...
- Spring Cloud认知学习(一):Spring Cloud介绍与Eureka使用
目录 Spring Cloud的介绍 微服务的介绍 Spring Cloud出现的原因: 常见场景: 微服务的优劣势: Spring Cloud版本问题 版本介绍 与Spring Boot版本对应关系 ...
- 部署SSL站点 IIS+asp.net
使用SSL必须要有证书,今天我们就使用IIS内置的证书完成SSL的部署. 1.打开MMC证书管理器,文件->添加/删除管理单元->证书,双击->确定 2.找到:个人->证书下有 ...
- mybatis分页助手分页
一.编写dao及配置文件 (1)配置文件两种方式 第一种: <!--SqlSeesionFactoryBean对象--><bean id="sqlSessionFactor ...
- Arthas 使用(一) —— 基础命令
Arthas 简介 Arthas 是 Alibaba 开源的 Java 诊断工具,根据官方介绍,它提供了如下工功能: 官方文档地址: https://alibaba.github.io/arthas/ ...
- JS的函数和对象四
复习 数组 toString/join/concat/slice/splice/reverse/sort/ push/pop/unshift/shift 字符串 new String(2) / S ...