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