我正在使用Spring JDBC的批註驅動事務管理。當事務處於非事務中時回滾Spring JDBC操作
我想春天拋出一個異常,當我忘了用@Transactional註釋一個插入/更新/刪除的服務方法。
默認情況下,即使不在事務中,也可以插入/更新/刪除數據。
我正在使用Spring JDBC的批註驅動事務管理。當事務處於非事務中時回滾Spring JDBC操作
我想春天拋出一個異常,當我忘了用@Transactional註釋一個插入/更新/刪除的服務方法。
默認情況下,即使不在事務中,也可以插入/更新/刪除數據。
您可以在您的DAO圖層中使用Propagation.MANDATORY
。
Propagation.MANDATORY
將不會啓動交易。它將檢查特定方法是否附加到事務中,如果不是容器將拋出異常。
根據文檔(春季文檔),它只是元數據,並進行指示的方法或接口可以通過一些配置,即是「事務意識」(即
只需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連接。
您可以在您的DAO層使用Propagation.MANDATORY – 2014-10-30 10:43:15
選擇僅在服務層使用@Transactional,因爲事務總是從那裏開始的。 – yannisf 2014-10-30 11:01:32
那麼你可以通過反射遍歷所有服務類,並檢查它們是否都包含@Transactional註釋 – 2014-11-02 17:12:22