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 查询的正确方法是啥?

Nodejs 承诺 async/await 不能正常工作

无法理解 async/await nodejs

如何使用 async/await 在 NodeJS 中创建 TCP 客户端?

NodeJS 等待 axios+nedb 函数 async/await 运行下一个查询