声明事务管理建立在AOP上,本质上就是对方法前后进行拦截的,然后再目标方法开始之前创建或者是加入一个事务的,再执行完目标方法后根据实际的情况进行提交或者是回滚事务操作的。
即就是@Transactional注解在代码执行出错的时候可以进行事务的回滚操作。
使用SpringBoot的时候,@Transactional的说明如下:
@SpringBootApplication
@EnableCaching
@EnableScheduling
@EnableTransactionManagement
@MapperScan("com.chd.dfs.mapper")
@ServerletComponentScan
public class DFSApplication{
public static void main(String[]args){
SpringApplication.run(DFSApplication.class,args);
}
}
使用的说明:
- 需要在启动类上加上@EnableTransactionManagement注解
- 当作用在类上的时候,该类的所有的public方法都将具有该类型的额事务的属性,同时页在方法级别使用该注解来覆盖类别的定义
- 在项目中若添加啦@Transactional(rollbackFor=Exception.class),则这个类中的方法抛出异常就会产生回滚操作,数据库里面也会进行回滚。
- @Transactional注解中若不添加rollbackFor属性的话,事务只是会在遇到RuntimeException的时候才会回滚,加上了后,可以让事务在遇到非运行时候的异常也会产生回滚的操作。
常见的Run Exception的异常有:
在开发过程中常见的RuntimeException类型的异常主要有以下几种。
- ArithmeticException:数学计算异常。
- NullPointerException:空指针异常。
- NegativeArraySizeException:负数组长度异常。
- ArrayOutOfBoundsException:数组索引越界异常。
- ClassNotFoundException:类文件未找到异常。
- ClassCastException:类型强制转换异常。
- SecurityException:违背安全原则异常。
其他非RuntimeException类型的常见异常主要有以下几种。 - NoSuchMethodException:方法未找到异常。
- IOException:输入输出异常。
- EOFException:文件已结束异常。
- FileNotFoundException:文件未找到异常。
- NumberFormatException:字符串转换为数字异常。
- SQLException:操作数据库异常
其次还会有就是注解时效的时候
- @Transactional 应用在非 public 修饰的方法上
事务拦截器在目标方法执行前后进行拦截,内部会调用方法来获取Transactional 注解的事务配置信息,调用前会检查目标方法的修饰符是否为 public,不是 public则不会获取@Transactional 的属性配置信息。 - @Transactional 注解属性 rollbackFor 设置错误
rollbackFor 可以指定能够触发事务回滚的异常类型。Spring默认抛出了未检查unchecked异常(继承自 RuntimeException 的异常)或者 Error才回滚事务;其他异常不会触发回滚事务。如果在事务中抛出其他类型的异常,但却期望 Spring 能够回滚事务,就需要指定rollbackFor属性。 - 同一个类中方法调用,导致@Transactional失效
在做开发的时候,难免会遇到对同一个类的方法的调用,这个原因就是SpringAOp代理造成的,因为只有当事务的方法被当前类意外的代码调用时候,才会由spring生成的代理对象来进行管理的 - 使用try/catch的时候将@Transactional失效的问题
如果你手动的catch捕获这个异常并进行处理,事务管理器会认为当前事务应该正常commit,就会导致注解失效,如果非要捕获且不失效,就必须在代码块内throw new Exception抛出异常。 - 数据库引擎不支持事务的管理
开启事务的前提就是需要数据库的支持 - 开启多线程任务时,事务管理会受到影响
线程不能够默认使用spring的事务,也不能获取spring注入的bean在被spring声明式事务管理的方法内开启多线程,多线程内的方法不被事务控制。