今天在无意间看到的这个问题,spring事务事关紧要,以此记录,以备后续之需:
一,开启事务首先看数据库本身对应的库、表所设置的引擎是什么,Myisam是不支持事务,InnoDB是支持事务的
二,@Transactional所注解的方法是否为public
三,@Transactional所注解的方法所在的类,是否有@Service或@Component注解,如果没有,事务不生效
四,如需定义在方法上的事务生效,调用方需在这个方法所在类的外面。(类内部的其他方法调用了这个注解了@Transactional的方法,事务是不会生效的)
五,注解为事务范围的方法中,事务的回滚仅仅对于 unchecked 的异常有效。对于checked的异常无效。也就是说事务回滚仅仅发生在出现Runtime Exception或Error的时候。如果希望一般的异常也能触发事务回滚,需要在注解了@Transactional的方法上将@Transactional回滚参数设为:
@Transactional(rollbackFor=Exception.class)
六,非springboot项目,需要检查spring配置文件xml中:
1.扫描包范围是否配置好,否则不会在启动时spring容器中创建和加载对应的bean对象
<context:component-scan base-package="com.hopelee" ></context:component-scan>
2.事务是否已经配置成开启
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>