本來只是想看看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。