Spring事務之七(事務自動提交)
阿新 • • 發佈:2018-12-31
一、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)