Spring data jpa @transactional

12
下面是我的应用程序流程:
控制器 - 服务 - 存储库
在服务层中,我们有 @Transactional 注释。我们还有 jpa:repository 配置,在其中指定实体管理器和事务管理器。
我有一个疑问,我觉得在 jpa:repositories 中指定的事务管理器是被考虑的,而在服务层指定 @Transactional 没有影响。
例如:服务层的 @Transactional 可以映射到自定义事务管理器,而由服务调用的存储库可能有不同的事务管理器。那么这样做会有问题吗?
有人能澄清一下吗?当我们使用 jpa 存储库时,我们是否需要在服务层放置 @Transactional?

4
DAO层不能划分事务:单个工作单元通常会使用多个DAO,并由单个事务服务方法协调。既然您只需要一个,为什么要定义2个不同的事务管理器? - JB Nizet
是的... 因为当您进行多个数据库调用时,希望有一个单独的事务而不是多个。因此,您需要在服务级别启动一个事务。 - M. Deinum
同意。当前实现存在设计问题。该服务调用与两个不同模式连接的资源库(这些只是纯选择查询,而不是JTA)。这就是为什么jpa资源库配置了不同的实体管理器工厂和不同的事务管理器的原因。 - lives
1个回答

28
请参见Spring Data参考文档的2.3节: http://docs.spring.io/spring-data/jpa/docs/1.0.0.M1/reference/html/#transactions
默认情况下,您的存储库上的CRUD方法是事务性的。虽然可以根据需要配置这些事务,但通常情况下建议在Service层中指定事务,这种情况下:
嵌套的事务配置将被忽略,因为外部事务配置决定实际使用的配置。
因此,回答您的问题,不管有没有Spring Data事务管理,都应在服务层指定事务。

谢谢 - 这是非常有用的信息。我会在调试模式下重新测试并验证上述内容。 - lives
2
我注意到存储库中的事务拦截器没有使用服务层启动的transactionManager。在存储库代理中,通过名称“transactionManager”执行搜索并使用它。如果我们希望Spring JPA数据成为由服务层启动的事务的一部分,是否需要进行任何设置? - lives

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接