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>

事務申明式管理(通過控制spring控制業務層面上的方法名定義public int updateAdSpaceClickNumber(Long adSpaceId))


    <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);
        }
      
        //......
           
    }

三、 當spring控制的一個事務執行完成後會,統一提交快取的sql語句

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