场合
用户很可能不会直接与各种服务对象(POJO或会话Bean)进行交互,因为使用Facade模式会将不同的单个服务收集到一起。
@Transactional
注释应用于单个服务的方法级别,而不是Facade的方法。
这遇到了一个实际问题 - 如果服务没有接口,Spring就不能使用好的事务代理,导致各种复杂情况。
问题
什么是理想的做法?
@Transactional
注释移动到Facade方法(内部使用服务也必须流经Facade以确保交易)。您的现场经验是什么?从更广泛的角度来看,我也愿意接受考虑。
答案 0 :(得分:2)
如果服务没有接口,Spring仍然可以使用CGLIB proxies将事务方面应用于它,在大多数情况下它可以正常工作。当服务具有某些接口时会出现实际问题,但事务方法不是这些接口的一部分。
但是,将@Transactional
应用于Facade方法可能是一个更简洁的解决方案,因为Facade接口定义了明确的事务边界。如果您担心在这种情况下使用Facade的服务,您可以将@Transactional
应用于服务以及Facade方法。在这些情况下,当您调用Facade方法时创建的事务是propagated到服务方法。
答案 1 :(得分:1)
放置事务边界的唯一标准应该是业务逻辑标准而不是技术问题。如果服务方法应该是原子操作,那么在那里管理事务。如果您的外观可以组合两个或多个服务调用,并且它们应该“全部或全部执行”,这意味着事务应该放在外观中。正如axtavt所提到的,cglib代理可用于代理没有接口的类。
我还推荐Mark Richards撰写的这个系列:http://www.ibm.com/developerworks/views/java/libraryview.jsp?search_by=transaction+strategies: