2014-10-30 84 views
7

我正在使用Spring JDBC的批註驅動事務管理。當事務處於非事務中時回滾Spring JDBC操作

我想春天拋出一個異常,當我忘了用@Transactional註釋一個插入/更新/刪除的服務方法。

默認情況下,即使不在事務中,也可以插入/更新/刪除數據。

+1

您可以在您的DAO層使用Propagation.MANDATORY – 2014-10-30 10:43:15

+0

選擇僅在服務層使用@Transactional,因爲事務總是從那裏開始的。 – yannisf 2014-10-30 11:01:32

+0

那麼你可以通過反射遍歷所有服務類,並檢查它們是否都包含@Transactional註釋 – 2014-11-02 17:12:22

回答

1

您可以在您的DAO圖層中使用Propagation.MANDATORY

Propagation.MANDATORY將不會啓動交易。它將檢查特定方法是否附加到事務中,如果不是容器將拋出異常。

0

根據文檔(春季文檔),它只是元數據,並進行指示的方法或接口可以通過一些配置,即是「事務意識」(即

只需TX:註釋驅動和無@Transactional屬性,我相信你會得到應用的「默認」事務性:

傳播設置是必需的 隔離級別是DEFAULT 事務是讀/寫 事務超時默認爲基礎交易的默認超時。系統,或者如果超時不被支持則無。 ny RuntimeException觸發回滾,並且任何檢查的異常不會。 假設你正在使用的TX:註釋通過事務管理器,以驅動它,然後缺失出@Transactional屬性意味着不能爲只讀,隔離,傳播,的rollbackFor,noRollbackFor等應用這種性質

我相信MVC稍有不同 - 休眠會話直接與MVC請求綁定 - 即收到請求時事務開始。

回到你的榜樣,爲的getSession()中的HibernateDaoSupport的代碼如下:

protected final Session getSession() 
    throws DataAccessResourceFailureException, IllegalStateException 
{ 
    return getSession(this.hibernateTemplate.isAllowCreate()); 
} 

這反過來又來電:

/** * 獲得一個Hibernate的Session,無論是從目前的交易或 *一個新的。只有在「allowCreate」爲真時才允許後者。 * .......

protected final Session getSession() 
    throws DataAccessResourceFailureException, IllegalStateException { 
return getSession(this.hibernateTemplate.isAllowCreate()); 
} 

最終調用:

/** * .... *參數allowCreate非事務性會議是否應創建 *當沒有事務性會議,可以發現當前線程 * .... */

private static Session doGetSession(
    SessionFactory sessionFactory, Interceptor entityInterceptor, 
SQLExceptionTranslator jdbcExceptionTranslator, boolean allowCreate) 

從根本上說,一個交易:會話綁1:1 AFA ik,而沒有事務運行的唯一方法就是使用JBoss,它有一個「烘焙進去」持久層,爲您提供事務性(在封面下)。即使你在getSession()之後調用getQuery(),你仍然有一個事務發生,因爲它是一個JDBC/Hibernate連接。