【问题标题】:Spring data jpa @transactional春季数据 jpa @transactional
【发布时间】:2013-11-12 01:24:00
【问题描述】:

下面是我的申请流程

控制器 - 服务 - 存储库

在服务层我们有@Transactional注解 我们还有jpa:repository 配置,我们在其中指定实体管理器和txn 管理器。

我的怀疑是我觉得jpa:repositories中指定的txn manager被考虑了,在服务层指定@Transactional没有影响。 例如:服务层@Transactional 可以映射到自定义 txn 管理器,因为服务调用的存储库可能有不同的 txn 管理器。那样会不会有问题?

有人可以澄清一下,当我们使用 jpa 存储库时,我们是否需要将 @Transactional 放在服务层?

【问题讨论】:

  • 事务不能在 DAO 层划分:单个工作单元通常会使用多个 DAO,并由单个事务服务方法进行编排。既然你只想要一个,为什么还要定义 2 个不同的事务管理器?
  • 是的...因为当您进行多个数据库调用时,您需要一个事务而不是多个事务。因此,您需要在服务级别启动事务。
  • 同意。当前实现中存在设计问题。该服务调用连接到两个不同模式的存储库(这些是纯选择查询,而不是 JTA)。这就是 jpa 存储库配置不同实体管理器工厂和不同 txn 管理器的原因。

标签: spring spring-data spring-data-jpa


【解决方案1】:

参见 Spring Data Reference 的第 2.3 节:

http://docs.spring.io/spring-data/jpa/docs/1.0.0.M1/reference/html/#transactions

默认情况下,您的存储库上的 CRUD 方法是事务性的。虽然可以根据需要配置这些事务,但通常情况下,如上面的 cmets 中所建议的,事务是在服务层指定的,在这种情况下:

存储库中的事务配置将被忽略 然后作为外部事务配置确定实际的 用过。

因此,在回答您的问题时,可以(并且应该)在服务级别指定事务,而不考虑任何 Spring Data 事务管理。

【讨论】:

  • 谢谢 - 这是一个非常有用的信息。我将在调试模式下重新测试并验证上述内容。
  • 我观察到 Repository 的事务拦截器不使用服务层启动的 transactionManager。在 repository 代理处,执行搜索以通过名称 "transactionManager" 识别 bean,这就是用过的。如果我们希望 spring jpa 数据成为服务层启动的事务的一部分,是否需要做任何设置
猜你喜欢
  • 2016-01-30
  • 2015-09-18
  • 2020-02-20
  • 1970-01-01
  • 2015-10-06
  • 1970-01-01
  • 2020-02-02
  • 1970-01-01
  • 2020-08-19
相关资源
最近更新 更多