- 我有一個
@Transactional從存盤庫加載物體的主要服務。 @Transactional(propagation = Propagation.REQUIRES_NEW)然后這個服務呼叫一個加載相同物體的子服務來更新它的一個屬性
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void updateEntity(Long id) {
repository.findById(id).get().setName("NEW NAME");
}
- 不幸的是,從子服務完成的更新在主服務中是不可見的,即使我嘗試從存盤庫重新加載物體并且無論我選擇哪種隔離級別(READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ、SERIALIZABLE)。
這是主要服務的代碼:
@Transactional
public void transactional() {
MyEntity myEntity1 = repository.findById(1L).get();
log.info("{} - {}", myEntity1, myEntity1.getName()); // "OLD NAME"
subService.updateEntity(1L);
MyEntity myEntity2 = repository.findById(1L).get();
log.info("{} - {}", myEntity2, myEntity2.getName()); // "OLD NAME" again, and same reference as myEntity1
}
盡管如此,如果我在呼叫子服務之前沒有在主服務中加載一次物體,我確實會看到內部事務的變化。
@Transactional
public void transactional() {
subService.updateEntity(1L);
MyEntity myEntity2 = repository.findById(1L).get();
log.info("{} - {}", myEntity2, myEntity2.getName()); // "NEW NAME"
}
我想我想要實作的不是標準的做事方式,但我真的很想了解為什么如果一個物體在外部事務中加載一次,我就無法從內部事務中檢索更改。
uj5u.com熱心網友回復:
從內部事務編輯后,物體必須通過呼叫在外部事務中顯式重新加載EntityManager#refresh。(感謝@M.Prokhorov 提供線索)
entityManager.refresh(myEntity1);
正如@Kayaman 在評論我的問題時所說:
這是第一級快取在起作用。它不會重新加載物體(除非明確告知),因為您剛剛加載了它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/417333.html
標籤:
上一篇:StackOverflowErrorSpringbootOneToMany雙向映射
下一篇:SpringFox問題
