| 对于最新的稳定版本,请使用 Spring Data JPA 3.5.2! | 
交易性
默认情况下,继承自CrudRepository从SimpleJpaRepository.
对于读取作,事务配置readOnly标志设置为true.
所有其他配置都配置了普通@Transactional因此,默认事务配置适用。
由事务存储库片段支持的存储库方法从实际片段方法继承事务属性。
如果需要调整存储库中声明的方法之一的事务配置,请在存储库接口中重新声明该方法,如下所示:
public interface UserRepository extends CrudRepository<User, Long> {
  @Override
  @Transactional(timeout = 10)
  public List<User> findAll();
  // Further query method declarations
}这样做会导致findAll()方法以 10 秒的超时运行,并且没有readOnly旗。
改变事务行为的另一种方法是使用(通常)涵盖多个存储库的外观或服务实现。其目的是为非 CRUD作定义事务边界。以下示例显示了如何对多个存储库使用此类外观:
@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:annotation-driven />或使用@EnableTransactionManagement显式地让基于注释的 Facades 配置正常工作。
此示例假设您使用组件扫描。
请注意,对save从 JPA 的角度来看,这并不是绝对必要的,但仍然应该存在,以便与 Spring Data 提供的存储库抽象保持一致。
事务查询方法
声明的查询方法(包括默认方法)默认不会应用任何事务配置。
要以事务方式运行这些方法,请使用@Transactional在您定义的存储库接口上,如以下示例所示:
@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();
}通常,您需要readOnly要设置为的标志true,因为大多数查询方法只读取数据。与此相反,deleteInactiveUsers()利用@Modifying注释并覆盖事务配置。因此,该方法使用readOnlyflag 设置为false.
| 您可以将事务用于只读查询,并通过设置 | 
| 虽然示例讨论 |