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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值