如何为Spring 的事务管理器添加深度



Spring 2.5,休眠。

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

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

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

这是让我们感到悲伤的交易属性。

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

有没有一种方法可以让我具体说明这方面的深度?我想说的是,只回滚最高管理器层调用中的异常,而不回滚同一事务的后续调用中的例外。

谢谢!

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

因此,我的建议是重新考虑将交易定义应用于何处。但是,如果这不可行,您可能需要将事务建议更改为propagation=REQUIRES_NEW,这样每个管理器调用都会启动一个新事务,从而在一个管理器类调用另一个时回滚内部事务不会回滚整个事务。

我最终重构了内部服务方法,将抛出异常的部分提取到另一个方法中。然后,我调用该方法来预先批准我从外部服务执行的操作,并从内部服务调用新方法来抛出异常。通过这种方式,我规避了抛出的异常。

希望有一个更好的方法,不要经常承诺。:(

最新更新