一、MySQL數(shù)據(jù)庫事務(wù)自動提交
對于mysql數(shù)據(jù)庫,默認(rèn)情況下,數(shù)據(jù)庫處于自動提交模式。每一條語句處于一個單獨的事務(wù)中,在這條語句執(zhí)行完畢時,如果執(zhí)行成功則隱式的提交事務(wù),如果執(zhí)行失敗則隱式的回滾事務(wù)。對于正常的事務(wù)管理,是一組相關(guān)的操作處于一個事務(wù)之中,因此必須關(guān)閉數(shù)據(jù)庫的自動提交模式,下面是查看方式:
查看是否自動提交命令(ON表示開啟自動提交,值為1,OFF表示關(guān)閉自動提交,值為0):
關(guān)閉自動提交后,則用戶將一直處于某個事務(wù)中,直到執(zhí)行一條commit提交或rollback語句才會結(jié)束當(dāng)前事務(wù)重新開始一個新的事務(wù)。
二、Spring連接
如果結(jié)合Spring來獲取數(shù)據(jù)庫連接,就不用擔(dān)心,spring會將底層連接的自動提交特性設(shè)置為false,先看下Spring事務(wù)配置:
- <!-- 配置事務(wù) -->
- <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);
- }
- //......
- }
三、建議:當(dāng)一個連接關(guān)閉時,如果有未提交的事務(wù)則回滾任何未提交的事務(wù)(C3P0默認(rèn)的策略,C3P0的autoCommitOnClose屬性默認(rèn)是false)