2012-10-11 44 views

回答

10

無需包括RuntimeExceptionrollbackFor列表。即使你沒有提及它,它也會處理。

我已經試過了出來JdbcTemplate的: -

@Transactional(propagation = Propagation.REQUIRED, rollbackFor = MyException.class) 
public void updateSalary(final int increment){ 
    jdbcTemplate.update("update EMPLOYEE set emp_salary = emp_salary + ?", increment); 
    throw new RuntimeException("update exception"); 
} 
 
Output: 
After Insertion: 
1 Deepak 35000 
2 Yogesh 35000 
3 Aditya 35000 

update exception 
After Update 
1 Deepak 35000 
2 Yogesh 35000 
3 Aditya 35000 
+0

不會它從未反正提交因爲你有readOnly = true? –

+0

@AlexBeardsley thnx指出錯誤...我修改了答案..我重新運行代碼..是的,你不需要在rollbackFor列表中包含運行時異常。 – deepakraut

5

然而,請注意Spring框架的事務 基礎架構代碼將默認情況下,只有標記事務的 在運行時情況下回滾,未經檢查的異常;也就是當 拋出的異常是RuntimeException的一個實例或子類。 (錯誤也會 - 默認情況下會導致回滾)。檢查了 從事務性方法拋出的異常不會導致在回退的事務中導致 。

Source

這可能幫助:Spring transaction management with checked and unchecked exception

0

因此,它可以回滾與CheckedException以及(默認的RuntimeException),例如:

@Transactional(rollbackFor = Exception.class) 
public void save(Book book) throws Exception { 
    bookRepository.save(book); 
    System.out.println("Saved in transcation."); 
    // No data is persisted 
    if (true) { 
     throw new Exception(); 
    } 
}