簡體   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