-- 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优先阻塞队列结合乐观锁实现的更多相关文章

  1. 并发新构件之PriorityBlockingQueue:优先阻塞队列

    PriorityBlockingQueue:优先阻塞队列:是带有优先级的阻塞队列,一个无界阻塞队列,它使用与类 PriorityQueue 相同的顺序规则,并且提供了阻塞获取操作.虽然此队列逻辑上是无 ...

  2. Java并发包源码学习系列:阻塞队列实现之PriorityBlockingQueue源码解析

    目录 PriorityBlockingQueue概述 类图结构及重要字段 什么是二叉堆 堆的基本操作 向上调整void up(int u) 向下调整void down(int u) 构造器 扩容方法t ...

  3. Java并发之BlockingQueue 阻塞队列(ArrayBlockingQueue、LinkedBlockingQueue、DelayQueue、PriorityBlockingQueue、SynchronousQueue)

    package com.thread.test.thread; import java.util.Random; import java.util.concurrent.*; /** * Create ...

  4. Java核心知识点学习----多线程中的阻塞队列,ArrayBlockingQueue介绍

    1.什么是阻塞队列? 所谓队列,遵循的是先进先出原则(FIFO),阻塞队列,即是数据共享时,A在写数据时,B想读同一数据,那么就将发生阻塞了. 看一下线程的四种状态,首先是新创建一个线程,然后,通过s ...

  5. java PriorityBlockingQueue 基于优先级队列,的读出操作可以阻止.

    java PriorityBlockingQueue 基于优先级队列.的读出操作可以阻止. package org.rui.thread.newc; import java.util.ArrayLis ...

  6. 并发编程-concurrent指南-阻塞队列-优先级的阻塞队列PriorityBlockingQueue

    PriorityBlockingQueue是一个支持优先级的无界阻塞队列. 它使用了和类 java.util.PriorityQueue 一样的排序规则.你无法向这个队列中插入 null 值. 所有插 ...

  7. JUC 并发编程--09, 阻塞队列: DelayQueue, PriorityBlockingQueue ,SynchronousQueue, 定时任务线程池: ScheduledThreadPoolExecutor

    先看DelayQueue 这个是用优先级队列实现的无界限的延迟队列,直接上代码: /** * 这个是 {@link DelayQueue} 延时队列 的验证使用类 */ class MyDelayed ...

  8. 【iCore4 双核心板_uC/OS-II】例程九:消息队列

    一.实验说明: 前面介绍通过信息传递可以进行任务间的交流,信息也可以直接发送给一个任务,在uC/OS-II中每一个任务在它们内部都有一个消息队列,也即任务消息队列,用户可以直接给一个任务发送消息,不需 ...

  9. Redis分布式锁实现秒杀业务(乐观锁、悲观锁)

    https://blog.csdn.net/lmb55/article/details/78266905

随机推荐

  1. redis crackit入侵事件总结

    今天发现服务器有异常进程/opt/yam/yam,上网搜了搜,是由于redis未授权引起的入侵,查了些资料,这里做下总结. 1. 现象 有以下其一现象就要注意是否被入侵 crontab -l 可以看到 ...

  2. FOC 算法基础之欧拉公式

    文章目录 欧拉公式 几何意义 复数平面 动态过程 加法 FOC电压矢量的推导 总结 参考 FOC中电压矢量合成的推导,对于欧拉公式的几何意义做了一个全面的回顾. 欧拉公式 欧拉是一个天才,欧拉公式甚至 ...

  3. Battery Charging Specification Revision 1.2 中文版本

    Battery Charging Specification Revision 1.2 Li,Guanglei 2014.04.03 Rev0.1 转载请注明转自:http://blog.csdn.n ...

  4. dp规划之矩阵连乘问题

    问题描述:给定n个矩阵{A1,A2,...,An},其中Ai与Ai+1是可乘的,我们要计算这n个矩阵的最少计算次数.  将多个矩阵连乘抽象为最后一次计算即两个矩阵相乘. public static v ...

  5. 不同版本(2.3/2.4/2.5/3.0/3.1)web.xml头信息

    Web App 3.1 <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http:// ...

  6. 字符串匹配算法:Sunday算法

    背景 我们第一次接触字符串匹配,想到的肯定是直接用2个循环来遍历,这样代码虽然简单,但时间复杂度却是\(Ω(m*n)\),也就是达到了字符串匹配效率的下限.于是后来人经过研究,构造出了著名的KMP算法 ...

  7. .Net(c#)使用 Kafka 小结

    .Net(c#)使用 Kafka 小结 1.开篇 由于项目中必须使用 kafka 来作为消息组件,所以使用 kafka 有一段时间了.不得不感叹 kafka 是一个相当优秀的消息系统.下面直接对使用过 ...

  8. gentoo 下安装lamp

    更新系统 emerge --sync emerge --update world 安装apache emerge www-servers/apache rc-update add apache2 de ...

  9. 7.2 Go type assertion

    7.2 Go type assertion 类型断言是使用在接口值上的操作. 语法x.(T)被称为类型断言,x代表接口的类型,T代表一个类型检查. 类型断言检查它操作对象的动态类型是否和断言类型匹配. ...

  10. Django视图函数之三种响应模式

    视图函数响应处理: from django.shortcuts import render,HttpResponse,redirect (1)render 处理模板文件,可以渲染模板,第一个参数必须为 ...