首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果发生异常,JPA将停止在事务中执行代码

如果发生异常,JPA将停止在事务中执行代码
EN

Stack Overflow用户
提问于 2020-06-08 16:34:10
回答 1查看 184关注 0票数 2

我有一个JPA事务,如下所示(使用控制器通知来捕获异常)

代码语言:javascript
复制
@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)
}

工作正常,但问题是如果保存失败并引发异常,它仍然调用审计日志服务,然后抛出异常。导致创建错误的审计条目。

期望流

  1. 呼叫保存功能
  2. 保存失败
  3. 事务停止并回滚
  4. 控制器通知捕获异常。

实际流量

  1. 呼叫保存功能
  2. 保存失败
  3. 审计日志服务称为
  4. 事务回滚
  5. 控制器通知捕获异常。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-08 17:00:39

这是分布式系统中计算机科学中一个常见的问题。

基本上,您想要实现的是在多个系统之间进行原子操作。

您的事务只跨越本地(或第一个)数据库,仅此而已。当对第二个系统的REST调用启动并成功时,但是第一个保存导致崩溃时,您希望在第一个系统上有回滚(第一个保存),在第二个系统上也有回滚。这方面存在多个问题,在多个系统之间很难保持类似原子的一致性。

  1. 在这种情况下,可以使用数据库支持的技术:

您可能需要的是一个2% / 3PC,或者以某种方式更改请求的处理。当然,交换条件是,你必须牺牲即时的结果才能最终保持一致性。

  1. 你可以用eventual-consistency

例如,将message发送到某些存储以供以后处理,->使两个系统都读取message

  • System1从存储区读取此message并保存myObj
  • System2从存储区读取此message并记录更改

当然,“最终”会发生这种情况--无论是在处理过程中还是以后(例如,有人杀死了服务器或部署了错误代码,服务器无限期地重新启动),都无法保证这两个系统都能正常运行。

此外,您将牺牲read-after-write一致性。

您可以在发生故障时使用补偿交易

我建议阅读更多关于分布式系统主题的文章:

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62266911

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档