我在控制器層有一個父事務,但是我想在呼叫存盤庫時啟動一個新事務,為此我嘗試將 Repository 介面注釋如下
@Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRES_NEW)
public interface EventRepo extends JpaRepository<Event, Integer>{ }
但是,這似乎不會在呼叫 EventRepo#save 時啟動新事務。為什么?
這是我的服務層。
public interface IApplicationService {
void save(Event event);
}
@Service
public class ApplicationService implements IApplicationService {
@Autowired
private EventRepo eventRepo;
@Override
public void save(Event event) {
eventRepo.save(event);
}
}
它依次從控制器層呼叫
@RequestMapping(value="/{indicator}", method=RequestMethod.POST)
@Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRES_NEW)
@ResponseBody
public String processRequest(@PathVariable Integer indicator) {
Event event = new Event("Student1");
service.save(event);
if(indicator != 0) {
throw new RuntimeException();
}
return "Success";
}
但是,如果我使用 @Transactional 注釋 Service 介面,則一切正常
@Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRES_NEW)
public interface IApplicationService {
void save(Event event);
}
當我說作業是什么意思時,如果我運行以下 curl 命令,我將在 h2 db 中看到 2 行事件物體
curl -X POST http://localhost:8080/1
curl -X POST http://localhost:8080/0
我知道在服務層然后是存盤庫或控制器層控制事務是很好的,以這種方式構建情況可以很容易地演示問題。
Spring boot starter 版本是 2.5.6 以下依賴有 springboot starter 管理的版本
- spring-boot-starter-data-jpa
- spring-boot-starter-web
- 龍目島
- 小時2
這是一個執行緒,它建議注釋 Repository 層應該是可以的,盡管不鼓勵它。 JpaRepository 上的 @Transactional
uj5u.com熱心網友回復:
在這篇 Spring 文章中,我們可以閱讀以下內容:
此外,我們可以去掉方法的 @Transactional 注釋,因為 Spring Data JPA 存盤庫實作的 CRUD 方法已經使用 @Transactional 進行了注釋。
對我來說,這意味著@Transactional你添加到你的任何注解EventRepo都會被@Transactional上面在 CRUD 方法中提到的注解覆寫。話雖如此,我真的懷疑@Transactional注解對JpaRepository方法有任何影響。它會在您自己的自定義方法中,但在我看來,它在繼承的方法中沒有。
uj5u.com熱心網友回復:
為了在EventRepo#save覆寫保存方法中應用您自己的事務設定:
@Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRES_NEW)
public interface EventRepo extends JpaRepository<Event, Integer>{
@Override
Event save(Event event);
}
解釋
Spring 會忽略您的@Transactional注解,因為它無法save在EventRepo代理中找到該方法并應用來自父CrudRepository介面的默認事務設定。
進一步閱讀:Spring @Transactional 如何真正作業?
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/344085.html
