<!--掃描service包(包含子包)下所有使用註解的類型--> <context:component-scan base-package="com.song.ssm.service"/> <!--配置事務管理器(mybatis採用的是JDBC的事務管理器)--> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> <!--配置基於註解的聲明式事務,默認使用註解來管理事務行爲--> <tx:annotation-driven transaction-manager="transactionManager"/>
xml配置如上
1.添加聲明式事務配置
然後在service.impl層測試拋出異常,回滾操作的數據,在方法上添加註解
@Transactional(rollbackFor=Exception.class)//作用是當前方法拋出rollbackFor指定的異常類時則回滾
2.發現拋出異常後,操作的數據未回滾,開始查找原因
嘗試手動回滾數據
Venue venue = new Venue(); venue.setShowflag(1);// 測試修改數據 try { updateByPrimaryKey(venue); String string = "abc"; Integer.valueOf(string); } catch (Exception e) { TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); //手動開啓事務回滾 throw new RuntimeException(); }
發現依舊未回滾操作數據
3.檢查數據庫表引擎
發現數據表引擎是MyISAM,查找了一下引擎之間的關係,如下
然後得知我們要求處理事務則必須使用INNODB或者BERKLEYDB,然後用sql語句將表修改爲INNODB,ALTER TABLE `Venue` ENGINE = `InnoDB
修改後我再次嘗試拋出異常回滾代碼,回滾機制生效了,被操作的數據沒有持久化到數據庫中
4.總結
由於數據庫引擎的限制,MyISAM引擎沒有對事務處理的能力,將表的引擎切換到INNODB後,才支持對事務的處理