交易性

默认情况下,方法继承自原油仓库继承了从中的事务配置SimpleJpaRepository. 对于读取作,事务配置只读旗帜设置为true. 其他所有配置均为平面@Transactional所以默认的交易配置是适用的。 由事务仓库片段支持的存储库方法继承了实际片段方法的事务属性。spring-doc.cadn.net.cn

如果你需要调整仓库中某个方法的事务配置,请在仓库界面中重新声明该方法,如下:spring-doc.cadn.net.cn

例子1。CRUD 的自定义事务配置
public interface UserRepository extends CrudRepository<User, Long> {

  @Override
  @Transactional(timeout = 10)
  public List<User> findAll();

  // Further query method declarations
}

这样做会导致findAll()以10秒超时且不使用只读旗。spring-doc.cadn.net.cn

改变事务行为的另一种方法是使用(通常)覆盖多个存储库的表象或服务实现。其目的是为非CRUD作定义事务边界。以下示例展示了如何将此类门面用于多个存储库:spring-doc.cadn.net.cn

例子2。利用一个界面来定义多个仓库调用的事务
@Service
public class UserManagementImpl implements UserManagement {

  private final UserRepository userRepository;
  private final RoleRepository roleRepository;

  public UserManagementImpl(UserRepository userRepository,
    RoleRepository roleRepository) {
    this.userRepository = userRepository;
    this.roleRepository = roleRepository;
  }

  @Transactional
  public void addRoleToAllUsers(String roleName) {

    Role role = roleRepository.findByName(roleName);

    for (User user : userRepository.findAll()) {
      user.addRole(role);
      userRepository.save(user);
    }
  }
}

该示例导致调用addRoleToAllUsers(...)在事务中运行(参与现有事务,或如果没有交易在运行时创建新的事务)。仓库中的事务配置被忽略,因为外部事务配置决定了实际使用的事务配置。注意你必须激活<tx:注释驱动 />或使用@EnableTransactionManagement明确用于使基于注释的界面配置正常工作。 这个例子假设你使用了分量扫描。spring-doc.cadn.net.cn

注意 调用从 JPA 的角度来看,这并非绝对必要,但应当仍然存在,以保持与 Spring Data 提供的仓库抽象的一致性。spring-doc.cadn.net.cn

事务查询方法

声明查询方法(包括默认方法)默认不会应用任何事务配置。 要以事务方式运行这些方法,请使用@Transactional在你定义的仓库接口中,如下例所示:spring-doc.cadn.net.cn

例子3。使用@Transactional at query方法的应用
@Transactional(readOnly = true)
interface UserRepository extends JpaRepository<User, Long> {

  List<User> findByLastname(String lastname);

  @Modifying
  @Transactional
  @Query("delete from User u where u.active = false")
  void deleteInactiveUsers();
}

通常,你想要的只读将 设置为 的标志true,因为大多数查询方法只读取数据。与此形成对比的是,deleteInactiveUsers()利用@Modifying注释并覆盖事务配置。因此,该方法运行于只读旗帜设置为false.spring-doc.cadn.net.cn

你可以用事务进行只读查询,并通过设置只读旗。然而,这样做并不等同于检查你是否触发了作性查询(尽管有些数据库会拒绝插入更新只读事务中的语句)。这只读flag 则作为向底层 JDBC 驱动传递的提示,用于性能优化。此外,Spring 对底层的 JPA 提供者进行一些优化。例如,当与休眠配合使用时,冲洗模式设置为从不当你将事务配置为只读这会导致休眠跳过脏检验(对大型对象树有明显改进)。spring-doc.cadn.net.cn

同时讨论示例@Transactional在仓库中使用时,我们通常建议在开始工作单元时声明事务边界,以确保适当的一致性和期望的事务参与。spring-doc.cadn.net.cn