SpringBoot工程中事务控制
概述
Spring 框架中提供了一种声明式事务的处理方式,此方式基于AOP代理,可以将具体业务逻辑与事务处理进行解耦。也就是让我们的业务代码逻辑不受污染或少量污染,就可以实现事务控制。
事务控制
SpringBoot工程中,可以通过@Transactional注解描述业务类或方法,进而告诉Spring框架,类中的所有方法或某些方法为切入点方法。这些方法执行时会进行事务控制。例如:
@Transactional(readOnly = false,rollbackFor = Throwable.class)
public class XxxServiceImpl implements XxxService{
@Transactional(readOnly=true) //方法上的事务控制策略优先级高
int deleteById(Long... id)
}
其中,@Transactional常用属性有:
- timeout:事务的超时时间,默认值为-1,表示没有超时显示。如果配置了具体时间,则 超过该时间限制但事务还没有完成,则自动回滚事务。这个时间的记录方式是在事务 开启以后到 sql 语句执行之前。
- read-only:指定事务是否为只读事务,默认值为 false;为了忽略那些不需要事务的 方法,比如读取数据,可以设置 read-only 为 true。对添加,修改,删除业务 readonly 的值应该为 false。
- rollback-for:用于指定能够触发事务回滚的异常类型,如果有多个异常类型需要指 定,各类型之间可以通过逗号分隔。
- no-rollback- for: 抛出 no-rollback-for 指定的异常类型,不回滚事务。
- isolation 事务的隔离级别,默认值采用 DEFAULT。当多个事务并发执行时,可能会 出现脏读,不可重复读,幻读等现象时,但假如不希望出现这些现象可考虑修改事务 的隔离级别(但隔离级别越高并发就会越小,性能就会越差)
事务控制原理
Spring 事务管理是基于接口代理(JDK)或动态字节码(CGLIB)技术,然后通过 AOP 实 施事务增强的。当我们执行添加了事务特性的目标方式时,系统会通过目标对象的代理对 象调用 DataSourceTransactionManager 对象,在事务开始的时,执行 doBegin 方法, 事务结束时执行 doCommit 或 doRollback 方法。如图所示:
总结(Summary)
SpringBoot工程中的事务控制方式应用相对比较简单,但底层实现原理相对比较复杂,先应用,后续逐步分析其实现原理即可。