Spring Data Jpa / Hades 事务行为
Posted
技术标签:
【中文标题】Spring Data Jpa / Hades 事务行为【英文标题】:Spring Data Jpa / Hades Transaction Behaviour 【发布时间】:2011-08-06 08:34:38 【问题描述】:来自Spring Data JPA reference(之前的Hades),
存储库实例上的 CRUD 方法 默认情况下是事务性的。
如果一种方法涵盖多个存储库,例如:
@Transactional
public void addRoleToAllUsers(String roleName)
Role role = roleRepository.findByName(roleName);
for (User user : userRepository.readAll())
user.addRole(role);
userRepository.save(user);
参考状态
交易配置 存储库将被忽略为 外部事务配置 确定实际使用的。
内部事务将被忽略行为是默认的 Spring 事务行为还是由 Spring Data JPA 显式处理?
【问题讨论】:
【参考方案1】:这是一种默认行为。
如您所见,JpaRepository
的方法被注释为 @Transactional
,默认情况下具有传播 (REQUIRED
),这是该传播类型的正常行为(参见 10.5.7 Transaction propagation)。
【讨论】:
引用状态“交易将被忽略”似乎具有误导性。 @CK:听起来过于简单,但对我来说很清楚 -@Transactional
在存储库方法中不会导致在另一个事务中调用时创建事务。【参考方案2】:
JpaRepository
/实现类中的@Transactional
会导致这些方法默认只参与外部事务。因此,如果您认为“忽略”是一个误导性的词,请随时为它打开一个 JIRA(我认为在某种程度上是这样的;))。
如果您想更改 CRUD 方法的事务配置,您可以通过在具体存储库接口中重新声明 CRUD 方法并在其中添加包含您想要的配置的 @Transactional
来实现。详情请见reference documentation。
【讨论】:
【参考方案3】:这一切都取决于@Transactional 注释中设置的传播。默认设置为REQUIRED
,表示:如果没有事务上下文,则创建一个并在方法结束时提交;否则,将方法调用包含在现有事务上下文中。
还有其他的:REQUIRES_NEW、SUPPORTS、NEVER 等。有关详细信息,请参阅http://static.springsource.org/spring/docs/3.0.x/api/org/springframework/transaction/annotation/Propagation.html。
【讨论】:
以上是关于Spring Data Jpa / Hades 事务行为的主要内容,如果未能解决你的问题,请参考以下文章
spring-data-jpa 和 spring-boot-starter-data-jpa 的区别
spring-data详解之spring-data-jpa:简单三步快速上手spring-data-jpa开发