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开发

spring data jpa怎么和solr整合

spring data jpa问题

Spring Data 系列 Spring+JPA(spring-data-commons)

spring-data-jpa软删除方案