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)