NodeJS 中使用 Async/Await 的顺序分类账条目
Posted
技术标签:
【中文标题】NodeJS 中使用 Async/Await 的顺序分类账条目【英文标题】:Sequential ledger-like entries in NodeJS with Async/ Await 【发布时间】:2021-03-22 14:45:07 【问题描述】:我正在设计一个会计/簿记应用程序,我的表格有以下列 -
-
交易 ID
交易详情
金额
期末余额
所有的交易都通过一个队列一个接一个地馈送到 NodeJS 函数
但是,在保存每笔交易时,我必须获取上一笔交易以获得最后的期末余额,并将当前交易金额添加到相同的金额中以获得新的期末余额
但我必须使用 async/await 来获取先前的事务,因此事件循环在几毫秒内是空闲的,在此期间函数接收来自用户的新事务事件。这会导致数据出现很多不一致,因为有时会插入具有相同期末余额的 2 行。
const prevTransaction = await Transaction.findOne(
where: userId ,
order: [['createdAt', 'DESC']]
)
await Transaction.create(
userId,
amount,
closingBalance: prevTransaction ? prevTransaction.closingBalance + amount : amount,
transactionDate
)
现在,如果系统批量接收大量事件,那么由于 GET 和 INSERT 查询之间的差距,数据可能会出现一些不一致。
在某些情况下,这是插入的数据
ID | Amount | ClosingBalance |
---|---|---|
1 | 20 | 20 |
2 | 20 | 40 |
3 | 20 | 40 |
4 | 10 | 50 |
5 | 20 | 60 |
理想情况下应该是 -
ID | Amount | ClosingBalance |
---|---|---|
1 | 20 | 20 |
2 | 20 | 40 |
3 | 20 | 60 |
4 | 10 | 70 |
5 | 20 | 90 |
我可以通过什么特殊方式调整上述代码以获得顺序效果?
这就是我使用 BullJS 队列的原因,以便一个接一个地处理事务。但是由于 2 个 await 调用,这个问题仍然存在。
【问题讨论】:
你在哪里存储队列? @Anatoly 我将 BullJS 用于队列,它使用 Redis 进行队列管理 如果您有一个传入队列,您可以从其中一个一个地获取事务,如何并行处理另一个事务? 【参考方案1】:如果正在处理任何事务并在插入事务后恢复它,我已经通过暂停作业队列暂时解决了这个问题 - link
很想听听任何替代方法,因为这种方法依赖于第三方库。
【讨论】:
以上是关于NodeJS 中使用 Async/Await 的顺序分类账条目的主要内容,如果未能解决你的问题,请参考以下文章
NodeJS - 在 Array.map 中使用 Async/Await 和“if”语句
在 NodeJs 中使用 async await 和 mariadb 查询的正确方法是啥?