2

情况

用户很可能不会直接与各种服务对象(PO​​JO 或会话 Bean)交互,因为使用外观模式将不同的单个服务收集到一组中。

注释应用于单个服务的@Transactional方法级别,而不是门面的方法。

这遇到了一个实际问题——如果服务没有接口,Spring 不能为它们使用好的事务代理,从而导致各种复杂性。

问题

什么是理想的做法?

  • 为了好的代理而创建单一的服务接口,
  • 或将@Transactional注释移动到 Facade 方法(因此内部使用服务也必须流经 Facade 以确保事务)。
  • 要不然?

你的现场经验是什么?我也愿意从更广泛的角度考虑。

4

2 回答 2

3

如果服务没有接口,Spring 仍然可以通过使用CGLIB 代理对其应用事务方面,在大多数情况下它工作正常。当服务有一些接口时会出现真正的问题,但事务方法不是这些接口的一部分。

然而,应用@Transactional到 Facade 方法可能是一个更干净的解决方案,因为 Facade 接口定义了清晰的事务边界。如果您担心在这种情况下使用没有 Facade 的服务,您可以应用@Transactional到服务以及 Facade 方法。在这些情况下,调用 Facade 方法时创建的事务会传播到服务方法。

于 2011-03-31T17:27:06.900 回答
1

放置事务边界的唯一标准应该是业务逻辑标准而不是技术问题。如果服务方法应该是原子操作,那么在那里管理事务。如果你的门面可以组合 2 个或更多的服务调用,并且它们应该是“执行全部或不执行”,这意味着事务应该放在门面。正如 axtavt 所提到的,cglib 代理可用于代理没有接口的类。

我还推荐 Mark Richards 的这个系列:http ://www.ibm.com/developerworks/views/java/libraryview.jsp?search_by=transaction+strategies :

于 2011-04-04T09:31:16.250 回答