今天遇到了@Transactional失效问题,检查了很多地方,查到的一些方案都是类似的几步:
首先确认数据库支持事务。即为InnoDB。MyISAM不支持事务。
方案1.@Transactional(rollbackFor=Exception.class)
方案2.异常处理要继承RuntimeException的异常。并且在service上层要继续捕获这个异常并处理
方案3.在service层方法的catch语句中增加:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();语句,手动回滚,这样上层就无需去处理异常
三种方案都走完了,还不行、、、
然后开始了我的思考、、、mysql引擎在5.1之前默认是MyISAM,之后是InnoDB,我用的5.5,不放心检查了一下数据库
1.show engines;
2.show variables like '%storage_engine%';
都是InnoDB,但是我的@Transactional就是不起作用,emmmmmmm
最后看了一下我的表,
show create table table_name;
表的引擎居然是MyISAM,此时内心、、、、、、、、、、、、、、、、、、、、、、、、、、
把表的引擎改成InnoDB后就正常了。
alter table table_name engine=innodb;
错误原因:用JPA生成表时,给我把表的引擎改成MyISAM了,懒没偷到位、、、、、、、、、、、
结束!