SSM框架 +MYSQL數據庫 配置事務控制的方法和注意點

最近在做項目的時候用到事務,我使用的是SSM框架,也就是Spring + SpringMVC + Mybatis 框架,配置事務的時候是用註解的方式,連接的數據庫是MySQL數據庫!

先說一下事務:簡單理解,事務就是控制兩個數據庫操作同時成功或者同時失敗,例如轉賬,要麼轉賬成功要麼轉賬失敗,成功就是一個賬號減了錢,另一個賬號加了錢,這是兩個數據庫操作,失敗的話,也不能是轉出的賬號少了錢,收入的賬號缺沒有收到錢!這樣轉出的人會瘋掉!只能是回滾操作,讓轉出的賬號錢回滾到沒轉以前一樣!

接下來說說SSM框架事務的配置吧!在spring的配置文件中 配置如下:

        <!--
4. 事務管理 : DataSourceTransactionManager dataSource:引用上面定義的數據源
-->
<bean id="txManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>


<!-- 5. 使用聲明式事務
transaction-manager:引用上面定義的事務管理器
-->
<tx:annotation-driven transaction-manager="txManager" />


第五點配置了聲明式事務之後,在service層就可以使用註解了,很簡單,代碼如下配置@Transactional 就是給該方法加了事務控制了


@Transactional(readOnly = false, propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
public String sendGiftService(int sendId, String anchAccount, int ticket,int live_record_id, int gift_id)  throws Exception {

        ....

}

事務一定是在執行數據庫語句發生異常的時候纔會觸發事務,如果需要根據實際業務觸發事務的話,需要手動拋出異常才能觸發事務,例如

                 //扣款deduct 
  i  = pocketInfoMapper.deductDiamondByUserid(ticket, sendId);
  j  = pocketInfoMapper.increaseTicketByUserid(ticket, anchUserid);//加錢

第一句是扣錢操作,第二句是加錢操作,但是就算是加錢沒有成功(update 語句)並沒有發生異常,  j返回的是0 這樣不會觸發事務回滾,那就要判斷

if(j==0){

   throw new  RuntimeException("收款不成功,出現異常了");

}


這樣手動拋出異常,而且這裏面不能去try catch,拋出到controller層去捕獲的話,這樣事務就可以觸發了,自動回滾!


到這裏ssm框架的事務配置是沒錯的,但是我還是失敗了,試了很久之後,不得其姐,有一位神祕的大神告訴我,有可能跟數據庫有關係! 

MYsql 數據庫引擎如果是MyISAM  它是不支持事務的,要修改數據庫引擎爲 INNODB 這樣纔會支持事務回滾。


修改數據庫引擎的方法如下:

查看mysql存儲引擎命令,在mysql>提示符下搞入show engines;字段 Support爲:Default表示默認存儲引擎  
2、設置InnoDB爲默認引擎:在配置文件my.cnf中的 [mysqld] 下面加入default-storage-engine=INNODB 一句
3、重啓mysql服務器:mysqladmin -u root -p shutdown或者service mysqld restart 登錄mysql數據庫,
 

經過測試,發現事務真的可以回滾了,好開心好開心!








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