-- 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. Java爬虫Ins博主所有帖子的点赞和评论导出excel

    前言 某天朋友说,能不能帮忙扒下ins的博主帖子,要所有帖子的点赞和评论,我本来准备让会python的同事写的,最后还是自己顺手写了,本来一开始准备用nodejs或者js写的,想着前端本地测试代理和导 ...

  2. CSS像素与绝对像素

    之前在电视的webview上投放广告页面时,遇到了个问题,就是视窗大小和文档大小不一致.最后发现原来有CSS Pixel这个概念,搜集了一些资料,希望能把这个问题捋捋清楚. 首先提出一个大家常常会忽略 ...

  3. C# 数据操作系列 - 8. EF Core的增删改查

    0.前言 到目前为止,我们看了一下如何声明EF Core的初步使用,也整体的看了下EF Core的映射关系配置以及导航属性的配置. 这一篇,我带大家分享一下,我在工作中需要的EF Core的用法. 1 ...

  4. 萌新带你开车上p站(终极番外)

    本文由“合天智汇”公众号首发,作者:萌新 0x01前言 这关其实和pwn关系不大,主要考察的都是linux下一些函数的操作,考察linux的基本功.涉及到的知识点包括一些经典的函数原型.IO重定向.文 ...

  5. Win32 Sdk 连接Access数据库

    /************************************************************* *** MyWinClass.cpp 创建窗口模板 *** vs2017+ ...

  6. Pytorch数据集读取

    Pytorch中数据集读取 在机器学习中,有很多形式的数据,我们就以最常用的几种来看: 在Pytorch中,他自带了很多数据集,比如MNIST.CIFAR10等,这些自带的数据集获得和读取十分简便: ...

  7. 【雕爷学编程】MicroPython动手做(02)——尝试搭建K210开发板的IDE环境

    喜欢今日头条,偶然看到广告,半个多月前交了8.9元,报名参加了头条上Python的四天培训课,呵呵,总算是有了零的开始(还是有点收获的,见https://www.sohu.com/a/38112874 ...

  8. 「雕爷学编程」Arduino动手做(24)——水位传感器模块

    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里 ...

  9. 2.4 Go与包

    1.1Go与包 1.1.1.  Go与包 1)开发中,往往要在不同的文件中调用其他文件的函数 2)Go代码最小粒度单位是"包" 3)Go的每一个文件都属于一个包,通过package ...

  10. 使用phoenix踩的坑与设计思考

    本文主要介绍在压测HBase的二级索引phoenix时踩的一个坑,使用时需要特别注意,而且背后的原因也很有意思,可以看出HBase和Phoenix对元数据设计上的差异. 1.问题介绍 在做phoeni ...