【问题标题】:Spring Data Jpa / Hades Transaction BehaviourSpring Data Jpa / Hades 事务行为
【发布时间】: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 显式处理?

【问题讨论】:

    标签: spring jpa transactions dao spring-data


    【解决方案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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-04
        • 1970-01-01
        • 2020-09-06
        • 2018-08-07
        • 1970-01-01
        • 2012-04-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多