默认情况下,继承自 的方法继承自 SimpleJpaRepository
的事务配置。
对于读取操作,事务配置标志设置为 。
所有其他事务都配置了普通事务,以便应用默认事务配置。
由事务存储库片段支持的存储库方法从实际片段方法继承事务属性。CrudRepository
readOnly
true
@Transactional
如果需要调整存储库中声明的某个方法的事务配置,请在存储库接口中重新声明该方法,如下所示:
public interface UserRepository extends CrudRepository<User, Long> {
@Override
@Transactional(timeout = 10)
public List<User> findAll();
// Further query method declarations
}
这样做会导致方法以 10 秒的超时运行,并且没有标志。findAll()
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
请注意,从 JPA 的角度来看,对 的调用并不是绝对必要的,但为了与 Spring Data 提供的存储库抽象保持一致,应该仍然存在。save
事务查询方法
默认情况下,声明的查询方法(包括默认方法)不会应用任何事务配置。
若要以事务方式运行这些方法,请在您定义的存储库接口上使用,如以下示例所示:@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
readOnly
false
您可以将事务用于只读查询,并通过设置标志来标记它们。但是,这样做并不能作为检查是否触发操作查询(尽管某些数据库在只读事务中拒绝和语句)。相反,该标志将作为提示传播到基础 JDBC 驱动程序,以实现性能优化。此外,Spring 对底层 JPA 提供程序执行了一些优化。例如,当与 Hibernate 一起使用时,刷新模式设置为当您将事务配置为 时,这会导致 Hibernate 跳过脏检查(对大型对象树的显着改进)。 |
您可以将事务用于只读查询,并通过设置标志来标记它们。但是,这样做并不能作为检查是否触发操作查询(尽管某些数据库在只读事务中拒绝和语句)。相反,该标志将作为提示传播到基础 JDBC 驱动程序,以实现性能优化。此外,Spring 对底层 JPA 提供程序执行了一些优化。例如,当与 Hibernate 一起使用时,刷新模式设置为当您将事务配置为 时,这会导致 Hibernate 跳过脏检查(对大型对象树的显着改进)。 |