關於SSM項目註解事務不回滾的問題

<!--掃描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後,才支持對事務的處理

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章