2014-11-06 94 views
0

我面臨着一些奇怪的問題..@Transactional繼續在異常處理

比方說:

@RequestMapping(value = "/do", method = RequestMethod.POST) 
public void do() { 
    try { 
     Float x = 200; 
     Float y = 100; 

     TestObject x = new TestObject(x, y); 
     x.setX(50); 

     if (x.getX() > x.getY()) 
     testService.save(x); 
     else 
     throw new Exception("ERROR"); 
    } 
    catch (Exception e) { 
     errorsService.save(e); 
    } 
} 

兩個save方法被標記爲@Transactional

問題:只要代碼引發異常 - errorsService.save(e);作出提交 - 將50添加爲x值TestObject。我試圖宣佈@Transactional(rollbackFor = Exception.class) - 沒有成功。始終提交,無需回滾!

在所有其他方法中,交易沒有任何問題 - 一切都很完美!

有什麼建議嗎?先謝謝你!

+0

什麼是異常的堆棧跟蹤?它在哪裏拋出? – 2014-11-06 14:51:39

+0

我手動做,這就是我想的問題 – nKognito 2014-11-06 14:52:13

+0

你爲什麼不回答這個問題? – 2014-11-06 14:57:37

回答

2

要使事務回滾,必須從@Transactional方法中引發異常,這在您的情況中不會發生。

+0

它似乎是..你能告訴我該如何實現它?基本上我用布爾標誌做了它,但是它看起來更好)) – nKognito 2014-11-06 15:07:57

+0

@nKognito爲什麼你在catch塊中調用save()如果你打算它回滾,並且因此不做任何事情?只要刪除else塊和catch塊,你就會得到你想要的:如果'x.getX()<= x.getY()'什麼都不會發生。 – 2014-11-06 15:13:20

+0

我留意在數據庫中保存異常,這就是爲什麼我這樣做) – nKognito 2014-11-06 15:20:08