我想出來的@Transactional
註釋,但我不知道這正是錯誤的,我有以下的代碼@Transactional不工作就扔一個RuntimeException
控制器
@RequestMapping(value = "/remove", method = RequestMethod.POST) void removeUserFlight(@RequestParam("flightId") Long flightId) throws Exception {
int affectedRows = userFlightDao.removeFlightByFlightId(flightId, user.getId());
throw new RuntimeException("Testing rollback?");
}
庫
@Repository
public interface UserFlightDao extends CrudRepository<UserFlight, Long> {
/** Named DELETE query defined in {@link UserFlight} */
@Modifying @Transactional int removeFlightByFlightId(Long flightId, Long userId);
}
我的印象是,如果在執行行後拋出異常,記錄不會被刪除。有誰能澄清這裏有什麼問題嗎?
編輯:我也試着把@Transactional放在控制器的方法上,但沒有任何區別。
edit2:試圖將邏輯移動到下面的Ralph建議的服務,它工作正常。我仍然不知道爲什麼控制器方法上的@Transactional直接不起作用。我會認爲現在解決了這個問題,但我仍然感到困惑。
您是否試過將'@ Transactional'放在控制器上並在DAO中刪除它? – Chaitanya
您在提交事務後拋出異常,應該如何回滾任何事物。 –
參見上面的@ M.Deinum評論。總的來說,將跨國行爲移動到更高抽象級別(服務)上是一個不錯的主意,這樣您就可以從各自具有自己事務邏輯的各種服務中使用相同的存儲庫方法(例如,將多個存儲庫合併爲一個服務方法,沒問題)。 –