1. 程式人生 > >Spring事務之七(事務自動提交)

Spring事務之七(事務自動提交)

一、MySQL資料庫事務自動提交    

對於mysql資料庫,預設情況下,資料庫處於自動提交模式。每一條語句處於一個單獨的事務中,在這條語句執行完畢時,如果執行成功則隱式的提交事務,如果執行失敗則隱式的回滾事務。對於正常的事務管理,是一組相關的操作處於一個事務之中,因此必須關閉資料庫的自動提交模式,下面是檢視方式:

        檢視是否自動提交命令(ON表示開啟自動提交,值為1,OFF表示關閉自動提交,值為0):

show variables like 'autocommit';

      關閉自動提交後,則使用者將一直處於某個事務中,直到執行一條commit提交或rollback語句才會結束當前事務重新開始一個新的事務。

二、Spring連線

  如果結合Spring來獲取資料庫連線,就不用擔心,spring會將底層連線的自動提交特性設定為false,先看下Spring事務配置:

<!-- 配置事務 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>

上面配置中,重要的是類:org.springframework.jdbc.datasource.DataSourceTransactionManager,看其對自動提交的處理:

protected void doBegin(Object transaction, TransactionDefinition definition) {
 
    //......
 
    if(con.getAutoCommit()) {
        txObject.setMustRestoreAutoCommit(true);
        if(this.logger.isDebugEnabled()) {
            this.logger.debug("Switching JDBC Connection [" + con + "] to manual commit");
        }
        con.setAutoCommit(false);
    }
  
    //......
       
}

三、建議:當一個連線關閉時,如果有未提交的事務則回滾任何未提交的事務(C3P0預設的策略,C3P0的autoCommitOnClose屬性預設是false)