繁体   English   中英

Spring Boot-从非事务性原因更新中校准事务性方法

[英]Spring Boot - caling transactional method from non-transactional cause update

我想知道最近遇到的一个案例。 假设我们有一个如下的服务方法:

@Override
public User addUser(UUID organizationId, User user) {
    Organization organization = organizationRepository.findById(organizationId).orElseThrow(IllegalArgumentException::new);
    user.setOrganization(organization);
    organization.getUsers().add(user);
    invitationService.deleteByUserEmail(user.getEmail());
    return user;
}

组织是通过存储库方法提供的:

@Repository
public interface OrganizationRepository extends JpaRepository<Organization, UUID> {

    Optional<Organization> findById(UUID id);
}

添加用户的工作仅是因为invitationService.deleteByUserEmail(user.getEmail()); 存在。 整个方法属于另一个服务,其外观如下:

@Override
@Transactional
public void deleteByUserEmail(String userEmail) {
    invitationRepository.deleteByUserEmail(userEmail);
}

我不确定我是否正确理解为什么添加用户有效。 根据Hibernate Docs的说法,仅当实体处于受管状态并且更新在单个事务中进行时,才会发生自动更新。 如果我的推论是正确的,则会发生以下步骤:

  1. 当请求到达并命中控制器时,实体管理器(休眠会话)将附加到当前线程。 (?)
  2. 处理请求的控制器方法,调用organizationService.addUser方法
  3. 组织是通过findById方法获取的, 方法默认为事务性和只读的(根据SimpleJpaRepository实现)。 此后该事务关闭,但是绑定到它的实体管理器仍在运行,并且组织实体仍处于管理状态。
  4. 更新发生
  5. InvitationService.deleteByUserEmail(user.getEmail()); 叫做。 因为它是事务方法,所以开始事务。 发生删除,并且提交事务并将所有更改(包括组织实体中的更改)刷新到数据库中。

尽管addUser方法是非事务性的,是否有可能?

在您的一个配置类中,您可能注册了特殊的过滤器,这些过滤器基本上在整个请求的生命周期内都打开会话/实体管理器:

org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter

要么

org.springframework.orm.hibernate5.support.OpenSessionInViewFilter

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM