如何在调用commit()或flush()后处理异常

时间:2013-05-19 10:26:28

标签: java jpa exception-handling

在commit()或flush()之后是否存在处理PersistenceExceptions的“最佳实践”?

我理解它的方式,在PersistenceException之后,事务将在任何情况下回滚,所以最好的方法是:我尝试再次合并()和commit() catch-block,或者我只是记录警告/错误并告诉用户再试一次?或完全不同的东西?

2 个答案:

答案 0 :(得分:2)

  

我是否尝试在catch-block中再次合并()和commit(),

这不太可行。当然,它不适用于当前交易。

  

或者我只是记录警告/错误并告诉用户再试一次?

当然记录错误/警告。是否告诉用户再试一次,取决于提交失败的原因。如果您对可能的原因没有一些了解,建议用户再试一次是......可疑。

  

还是别的什么呢?

如果您可以准确地诊断异常的原因(至少在某些情况下),您可以使用它来决定要做什么。但它可能变得复杂。基本上,您需要区分导致根本原因的案例:

  • 糟糕的用户输入,
  • 由其他一些事务提交或
  • 引起的陈旧数据等
  • 应用程序中的错误,死锁等,重试是不明智的。

(无论应用程序建议什么,有些用户可能会重试......)

答案 1 :(得分:1)

您通常唯一能做的就是记录问题并告知用户。 正如您已经提到的,正在进行的事务被标记为仅回滚。因此,任何进一步的数据库更改都是毫无意义的。

同时使你正在使用XA事务(分布式事务),即。配置所有内容以使用JTA事务管理器,因此只参与一个事务。如果您使用多个事务感知资源(两个数据库,db + jms等),则确实需要这样做。