最近在學習Spring5,學到事務管理這一塊,按照教程一步一步操作,編寫了一個轉賬操作的Service類,使用JdbcTemplate進行連接數據庫,在數據庫中用戶表創建兩個賬戶,轉賬方法對其中一個賬戶余額增加100元,對另一個減少100元,在Service類中有兩個方法,一個減少錢,一個增加錢,對整個類添加@Transactional事務注解,並在兩個方法之間故意設置一句int i = 10/0;
的異常代碼。運行測試,程序拋出ArithmeticException異常,加錢方法沒有被執行,同時事務管理沒有生效,lucy賬戶的余額減少了100,在遇到異常的情況下沒有發生回滾操作
通過網上百度了一堆資料,發現原來是數據庫引擎的問題,暈死。。。。
InnoDB和MyISAM是在使用MySQL最常用的兩個表類型,基本的差別為:MyISAM類型不支持事務處理等高級處理,而InnoDB類型支持。MyISAM類型的表強調的是性能,其執行數度比InnoDB類型更快,但是不提供事務支持,而InnoDB提供事務支持已經外部鍵等高級數據庫功能。
在數據庫中創建表的時候,默認使用了MyISAM,將其改成InnoDB以后,繼續測試,成功了!,在程序執行到異常的時候,事務操作生效,回滾了失敗的轉賬操作,lucy賬戶余額沒有減少。