[踩過的坑]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。

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