MongoDB 多文档事务的 Panache 最佳实践
MongoDB Panache Best Practices for Multi-Document Transactions
关于 MongoDB Panache 文档中的以下引述 [https://quarkus.io/guides/mongodb-panache]
MongoDB offers ACID transactions since version 4.0. MongoDB with Panache doesn’t provide support for them.
因此,是否有推荐的方法或最佳实践来处理多文档事务以确保原子性?
考虑示例:
public void buyCarTest() {
carRepository.increaseStock(1);
cashRepository.decreaseCash(10000);
}
如果我们手动执行,它将是:
- 检查写入第二个存储库的操作是否失败,并且
- 如果是,恢复在
carRepository
中所做的更改
这种方法充其量似乎很脆弱,尤其是当我写入的存储库超过 2 个时。
谢谢。
你提出的就是所谓的补偿,实现起来比较棘手
我宁愿为此使用基于事件的机制:您发送两个事件并异步处理它们,因此其中一个租户(股票经理)的故障不会影响第二个。
您也可以使用 MongoDB 事务,但为此您需要使用 MongoDB API 而不是 Panache(因此从您的实体获取集合并使用它)。
对 MongoDB 的事务支持正在进行中(请参阅 https://github.com/quarkusio/quarkus/pull/7222)您可以关注此问题,以便在实施时收到通知。
关于 MongoDB Panache 文档中的以下引述 [https://quarkus.io/guides/mongodb-panache]
MongoDB offers ACID transactions since version 4.0. MongoDB with Panache doesn’t provide support for them.
因此,是否有推荐的方法或最佳实践来处理多文档事务以确保原子性?
考虑示例:
public void buyCarTest() {
carRepository.increaseStock(1);
cashRepository.decreaseCash(10000);
}
如果我们手动执行,它将是:
- 检查写入第二个存储库的操作是否失败,并且
- 如果是,恢复在
carRepository
中所做的更改
这种方法充其量似乎很脆弱,尤其是当我写入的存储库超过 2 个时。
谢谢。
你提出的就是所谓的补偿,实现起来比较棘手
我宁愿为此使用基于事件的机制:您发送两个事件并异步处理它们,因此其中一个租户(股票经理)的故障不会影响第二个。
您也可以使用 MongoDB 事务,但为此您需要使用 MongoDB API 而不是 Panache(因此从您的实体获取集合并使用它)。
对 MongoDB 的事务支持正在进行中(请参阅 https://github.com/quarkusio/quarkus/pull/7222)您可以关注此问题,以便在实施时收到通知。