Spring Series---事務中JDBC是否自動提交解析

FeelTouch發表於2019-03-25

自動提交

預設情況下,資料庫處於自動提交模式。每一條語句處於一個單獨的事務中,在這條語句執行完畢時,如果執行成功則隱式的提交事務,如果
執行失敗則隱式的回滾事務。

對於正常的事務管理,是一組相關的操作處於一個事務之中,因此必須關閉資料庫的自動提交模式。不過,這個我們不用擔心,spring會將底層連線的自動提交特性設定為false。
org/springframework/jdbc/datasource/DataSourceTransactionManager.java

// switch to manual commit if necessary. this is very expensive in some jdbc drivers,
// so we don't want to do it unnecessarily (for example if we've explicitly
// configured the connection pool to set it already).
if (con.getautocommit()) {
    txobject.setmustrestoreautocommit(true);
    if (logger.isdebugenabled()) {
        logger.debug("switching jdbc connection [" + con + "] to manual commit");
    }
    con.setautocommit(false);
}

有些資料連線池提供了關閉事務自動提交的設定,最好在設定連線池時就將其關閉。但C3P0沒有提供這一特性,只能依靠spring來設定。
因為JDBC規範規定,當連線物件建立時應該處於自動提交模式,這是跨DBMS的預設值,如果需要,必須顯式的關閉自動提交。C3P0遵守這一規範,讓客戶程式碼來顯式的設定需要的提交模式。

連線關閉時的是否自動提交

當一個連線關閉時,如果有未提交的事務應該如何處理?JDBC規範沒有提及,C3P0預設的策略是回滾任何未提交的事務。這是一個正確的策略,但JDBC驅動提供商之間對此問題並沒有達成一致。
C3P0的autoCommitOnClose屬性預設是false,沒有十分必要不要動它。或者可以顯式的設定此屬性為false,這樣會更明確。

參考:https://www.cnblogs.com/yepei/p/4716112.html

相關文章