0

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

我理解它的方式,在 PersistenceException 之后,事务无论如何都会回滚,那么最好的方法是什么:我是否尝试在 catch-block 中再次合并()和提交() ,或者我只是记录一个警告/错误并告诉用户再试一次?还是完全不同的东西?

4

2 回答 2

2

我是否尝试在捕获块中再次合并()和提交(),

这不太可能奏效。当然,它不会在当前事务的上下文中工作。

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

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

还是完全不同的东西?

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

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

(有可能一些用户无论如何都会重试......无论应用程序建议什么。)

于 2013-05-19T10:55:50.757 回答
1

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

还要说明您正在使用 XA 事务(分布式事务),即。将所有内容配置为使用 JTA 事务管理器,因此只参与一个事务。如果您使用多个事务感知资源(两个数据库、db + jms 等),这确实是必需的。

于 2013-05-19T10:34:32.887 回答