1. 程式人生 > >[踩過的坑]spring事務為什麼不回滾!

[踩過的坑]spring事務為什麼不回滾!

本來只是想看看mysql插入資料時如果違反唯一約束,spring註解事務是否能回滾,因為粗淺的認為sql異常是check exception,不是runtime的,所以不給回滾,後來一通查詢,發現唯一約束異常不屬於sql的,而是spring封裝dao的runtime,於是試了下,發現居然不能回滾!接著又在事務註解顯示宣告唯一約束異常回滾,發現還是不行!

突然懷疑自己工程的所有事務失效了orz

然後各種試驗,發現只有某一個表事務不會滾,其他的都回滾,這個表是最後急著加的,怎麼加的都忘了。

然後各種找不同,還真找到了一些問題,但都是影響事務的!

最後想起給dba sql時,他提醒過一個事。。。

CREATE TABLE `test1` (
  `id` int(20) unsigned NOT NULL AUTO_INCREMENT,
  `number` varchar(45) COLLATE utf8_unicode_ci NOT NULL ,
  PRIMARY KEY (`id`),
  UNIQUE KEY `number_UNIQUE` (`number`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ;

 ENGINE=MyISAM要改成ENGINE=InnoDB 

當時著急也沒問,現在想想可能問題在這,難道走的不是一個connection?!

這時發現,所以程式碼都一樣,就剩表結構了,於是查了下兩者關係,驚倒了:MyISAM不支援事務!

改了之後,果然沒問題了!同時也驗證了,只要是Runtime異常的子類,都可以回滾,比如DataAccessException。