事务使用的前提
默认情况下,数据库处于自动提交模式。每条SQL处于一个单独的事务中,成功则提交,失败则回滚。
事务管理,就是将一组相关的SQL放于一个事务中,管理这一组SQL的提交或回滚,因此必须关闭数据库的自动提交方式。
@Transactional 注解一般应用在什么位置?
spring 官方文档强烈建议不能使用在接口(interface)上,虽然业务类可以实现接口层,但是接口上的注解是不会被继承过来的。如果是Aop通过代理的方式实现接口的话,一定要用jdk代理方式(接口代理),不能通过cglib方式代理(类集成代理方式),这种方式会导致接口上的注解信息会丢失,导致事务不能够生效。
主要是使用在业务实现类上,业务方法必须是 public 方法, 不能是 protected 和 private 方法,会主动注解无法生效。
不能通过本地方法调用,就是通过 this.xxx 的形式调用,也会导致注解无法生效。
@Transactional 事务回滚规则
@Transactional 注解提供了一些参数,可以设置回滚规则的。
1、noRollbackFor 指定不回滚 ---------> 可以指定那种异常不回滚
这个地方事务虽然不会滚,但是事务是生效的。
2、rollbackFor 指定回滚 ---------> 可以指定那种异常一定要回滚
3、RuntimeException 异常回滚 ---------> 在不指定的时候,就会去判断是否是运行时异常,若是运行时异常就会回滚
如果都不满足以上三种规则,就直接提交。
总结
使用位置
1、可以使用在接口或接口方法上,AOP必须是接口代理方式(JDK代理) — 强烈不推荐
2、可以使用在类以及类方法上 — 推荐
3、注解只能应用在public方法上,其他级别(protected, private)不生效。
4、只有来自外部方法调用,才能生效。(内部方法调用不生效)
回滚规则
1、默认配置下(RuntimeException 异常回滚),方法体只有抛出 RuntimeException ,才回滚事务;
2、设置 noRollbackFor 指定不回滚规则,方法体抛出指定的异常(XxxException.class)不回滚事务;
3、设置 rollbackFor 指定回滚规则,方法体抛出指定的异常(XxxException.class)会回滚事务;