我有一个JPA事务,如下所示(使用控制器通知来捕获异常)
@Transactional
public void save(MyObj myObj) {
// Attempt to save the object
this.myRepo.save(myObj)
// After it saves, call my audit log service to record the change
this.myAuditLogService.logChange(myObj)
}工作正常,但问题是如果保存失败并引发异常,它仍然调用审计日志服务,然后抛出异常。导致创建错误的审计条目。
期望流
实际流量
发布于 2020-06-08 17:00:39
这是分布式系统中计算机科学中一个常见的问题。
基本上,您想要实现的是在多个系统之间进行原子操作。
您的事务只跨越本地(或第一个)数据库,仅此而已。当对第二个系统的REST调用启动并成功时,但是第一个保存导致崩溃时,您希望在第一个系统上有回滚(第一个保存),在第二个系统上也有回滚。这方面存在多个问题,在多个系统之间很难保持类似原子的一致性。
您可能需要的是一个2% / 3PC,或者以某种方式更改请求的处理。当然,交换条件是,你必须牺牲即时的结果才能最终保持一致性。
eventual-consistency例如,将message发送到某些存储以供以后处理,->使两个系统都读取message:
message并保存myObjmessage并记录更改当然,“最终”会发生这种情况--无论是在处理过程中还是以后(例如,有人杀死了服务器或部署了错误代码,服务器无限期地重新启动),都无法保证这两个系统都能正常运行。
此外,您将牺牲read-after-write一致性。
您可以在发生故障时使用补偿交易。
我建议阅读更多关于分布式系统主题的文章:
https://stackoverflow.com/questions/62266911
复制相似问题