在 commit() 或 flush() 之后是否有处理 PersistenceExceptions 的“最佳实践”方式?
我理解它的方式,在 PersistenceException 之后,事务无论如何都会回滚,那么最好的方法是什么:我是否尝试在 catch-block 中再次合并()和提交() ,或者我只是记录一个警告/错误并告诉用户再试一次?还是完全不同的东西?
在 commit() 或 flush() 之后是否有处理 PersistenceExceptions 的“最佳实践”方式?
我理解它的方式,在 PersistenceException 之后,事务无论如何都会回滚,那么最好的方法是什么:我是否尝试在 catch-block 中再次合并()和提交() ,或者我只是记录一个警告/错误并告诉用户再试一次?还是完全不同的东西?
我是否尝试在捕获块中再次合并()和提交(),
这不太可能奏效。当然,它不会在当前事务的上下文中工作。
还是我只是记录一个警告/错误并告诉用户再试一次?
当然记录错误/警告。是否告诉用户重试,取决于提交失败的原因。如果您对可能的原因没有一些了解,建议用户应该再试一次是......可疑的。
还是完全不同的东西?
如果您可以准确诊断异常的原因(至少在某些情况下),您可以使用它来决定要做什么。但它可能会变得复杂。基本上,您需要区分根本原因是:
(有可能一些用户无论如何都会重试......无论应用程序建议什么。)
您通常唯一能做的就是记录问题并通知用户。正如您已经提到的,正在进行的事务被标记为仅回滚。因此,任何进一步的数据库更改都毫无意义。
还要说明您正在使用 XA 事务(分布式事务),即。将所有内容配置为使用 JTA 事务管理器,因此只参与一个事务。如果您使用多个事务感知资源(两个数据库、db + jms 等),这确实是必需的。