今天遇到了@Transaction的新坑:异常是在controller层产生的,而@Transaction在service层中添加。我在Controller层方法上加@Transaction注解就可以了,当然如果你用try{}catch{}捕获了异常,也起不到回滚作用。
顺便总结下常见的几种@Transaction不起作用的情况,希望能帮到各位。
1.spring项目:首先大家得先看看配置文件中是否开启事务 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
springBoot项目:在springBoot启动类加注解@EnableTransactionManagement,可不写。
2.看所要操作的数据库表是否是InnoDB引擎;因为MyISAM引擎是不支持事物的。
查看方法:show create table tableName;
修改引擎:alter table tableName type=InnoDB;
重启MySQL服务:service mysqld restart;
3.@Transaction所注解的方法应是public,确认service层是否加了@Service注解
4.异常一般分为非检查异常(unchecked Exception) 和检查时异常(checked Exception)
事物的回滚只对unchecked异常有效,对检查异常无效。若要使其他异常也起作用,则注解为
@Transaction(rollbackFor=Exception.class)
5.看异常是否发生在service层,
==》如果是,是否在已经捕获了异常在try{}catch{}中,是的话将异常抛出throw,因为对捕获到的异常不会回滚
==》如果不是,在Controller层方法上添加上@Transaction注解,异常没被捕获处理,则会回滚,反之不行需将异常抛出