![](/img/trans.png)
[英]When calling a spring Non-Transactional method from a Transactional Method in another instance, does the transaction get propagated?
[英]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的说法,仅当实体处于受管状态并且更新在单个事务中进行时,才会发生自动更新。 如果我的推论是正确的,则会发生以下步骤:
尽管addUser方法是非事务性的,是否有可能?
在您的一个配置类中,您可能注册了特殊的过滤器,这些过滤器基本上在整个请求的生命周期内都打开会话/实体管理器:
org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter
要么
org.springframework.orm.hibernate5.support.OpenSessionInViewFilter
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.