Spring 2.5,Hibernate。
我们的应用程序设计为具有服务层和管理器层。服务层提供所有只读服务,并向UI传达结果。对于需要更改数据库的服务,服务层执行所有初始只读函数,然后调用管理器层。
我们已经在我们的经理层周围设置了一个事务建议,以捕获来自经理层的所有异常并回滚这些事务。这在很大程度上非常有效。
问题出在我们让一个经理调用另一个经理来执行某些功能的情况。此功能抛出异常,这是从UI调用时的真正异常,但在客户端管理器内部处理并返回成功结果。事务管理器发现异常被抛出并且无论如何都回滚事务,即使异常处理成功。
这是导致我们悲痛的交易属性。
<tx:method name="*" propagation="REQUIRED" rollback-for="Throwable" no-rollback-for="OverridableException"/>
有没有办法可以指明这方面的深度?我想说的是,只回滚最高管理层调用中的异常,而不是后续调用同一事务中的异常。
谢谢!
答案 0 :(得分:2)
通常,您希望在事务性建议中包含对服务层的调用,这样,如果您的一个服务类对不同的管理器进行多次调用,则所有这些调用都包含在一个事务中 - 如果您要进行更改,则所有他们成功或一起回滚。这通常被称为(以及其他名称)Unit of Work pattern。
所以我的建议是重新考虑应用交易定义的位置。但是如果这不可行,您可能希望将事务建议更改为propagation=REQUIRES_NEW
,以便每个管理器调用启动一个新事务 - 从而在一个管理器类调用另一个管理器时回滚内部事务不会回滚整个事务事务。
答案 1 :(得分:0)
我最终重构了内部服务方法,将引发异常的部分拉出到另一个方法中。然后我调用该方法预先批准我正在从我的外部服务做什么,并从内部服务调用新方法来抛出异常。通过这种方式,我已经规避了被抛出的异常。
希望没有更频繁的承诺,有更好的方法。:(