2013-12-16 32 views
0

我的應用程序中的事務回滾之前運行一些代碼時出現問題。我想要的是在出現異常時進行回滾,但我還希望在發生異常時(包括任何錯誤或堆棧跟蹤)在應用程序的狀態表中存儲一些信息。在事務回滾中添加動作

這裏是我的代碼:

public void performAction(String approverId, Document document, String action) { 
     try { 
      LOG.info(String.format("routing document %s %s %s", approverId, document.getDocumentId(), action)); 
      getDocumentService().route(approverId, document, action); 
     } catch (Exception e) { 
      LOG.error(String.format("error routing document %s %s %s", approverId, document.getDocumentId(), action)); 
      LOG.error(e, e); 
      saveException(document, action, e); //this is what I want 
     } 
    } 

的saveException()方法簡單地創建一個對象,並將其保存到表中。

現在根據Spring文檔about transactions,這種回滾默認情況下發生在異常是運行時異常的地方,我已經確認回滾工作正常,但它不允許我的代碼運行並保存我需要的信息或者滾動一回(?)。

讚賞任何幫助或提示解決方案。

回答

0

這不是一個不常見的用例:事務失敗了,我們想要回滾它,但我們仍然想用錯誤原因更新一些監控數據庫表。

爲了在Spring應用程序中執行此操作,請使用REQUIRES_NEW傳播@Transactional註釋。

@Transactional REQUIRES_NEW propagation

這樣做,創建一個應用程序狀態跟蹤服務,並與REQUIRES_NEW事務傳播對其進行批註。

狀態跟蹤服務中的每個方法都將在其自己的單獨事務中運行,因此當主業務方法上的事務回滾時,狀態跟蹤信息仍將在數據庫上可用。

+1

謝謝!我會研究它並報告我的發現。 – Saeed