2

春季 2.5,休眠。

我们的应用程序被构建为具有服务层和管理器层。服务层提供所有只读服务并将结果传达给 UI。对于需要更改数据库的服务,服务层执行所有初始只读功能,然后调用管理器层。

我们围绕我们的管理层设置了一个事务建议,以捕获来自管理层的所有异常并回滚这些事务。这在大多数情况下都很好用。

问题在于我们有一个经理调用另一个经理来执行某些功能的情况。此功能会引发异常,这是从 UI 调用时真正的异常,但在客户端管理器内部处理并返回成功结果。事务管理器看到抛出了异常并回滚事务,即使异常已成功处理。

这是导致我们悲伤的交易属性。

<tx:method name="*" propagation="REQUIRED" rollback-for="Throwable" no-rollback-for="OverridableException"/>

有没有办法可以指定深度?我想说,只回滚最高管理者层调用中的异常,而不是对同一事务的后续调用中的异常。

谢谢!

4

2 回答 2

2

通常,您希望将对服务层的调用包装在事务建议中,这样如果您的一个服务类对不同的管理器进行多次调用,所有这些都包装在一个事务中 - 如果您正在进行更改,它们都会成功或一起回滚。这通常被称为(以及其他名称)工作单元模式

所以我的建议是重新考虑你在哪里应用你的交易定义。但如果这不可行,您可能希望将事务建议更改为propagation=REQUIRES_NEW,以便每个管理器调用启动一个新事务 - 因此当一个管理器类调用另一个管理器类时回滚内部事务不会回滚整个事务。

于 2012-10-12T13:26:12.047 回答
0

我最终重构了内部服务方法,以将引发异常的部分提取到另一个方法中。然后我调用该方法从外部服务中预先批准我正在执行的操作,并从内部服务中调用新方法以引发异常。这样,我就绕过了抛出的异常。

希望有一种更好的方法,而无需更频繁地提交。:(

于 2012-10-12T17:55:13.277 回答