spring事务注解

@Transactional 的属性

rollbackFor :遇到指定错误则回滚

  • 用法
@Transactional(rollbackFor = Exception.class)

propagation :指定事务管理方式

  • 用法
@Transactional(propagation = Propagation.REQUIRES_NEW)
  • Propagation 枚举
REQUIRED(0), // 如果已经有事务,加入事务,如果没有,则创建新事务
SUPPORTS(1),
MANDATORY(2),
REQUIRES_NEW(3), // 不管是否存在事务,都创建新事务,旧事务挂起,新事务执行完毕,继续执行旧事务
NOT_SUPPORTED(4),
NEVER(5),
NESTED(6);
  • 案例
    方法A中调用B后再调用C,三个方法中均有插入数据后再查询数据
    B方法的注解:@Transactional(propagation=Propagation.REQUIRES_NEW)
    C方法的注解:@Transactional(propagation=Propagation.REQUIRED)
    当方法B或者C报错时,A、B、C方法都回滚
    当方法A、B、C异常被捕获时,A、B、C事务不回滚(a、b、c均入库)
    当方法BC执行后,方法A报错时,A、C事务回滚,B事务不回滚(b数据入库)
    带有注解@Transactional(propagation=Propagation.REQUIRES_NEW)的方法走完之后,数据就会被提交入库
    ==另外需要注意方法内部调用@Transactional(propagation=Propagation.REQUIRES_NEW)注解不生效,比如A和B都在同一个方法中,A调用B,B方法是此注解,则不生效。同样,AOP拦截也拦截不到B==

加注解后的效果

在类上加事务注解,相当于在每个方法上加相同的注解
如果在方法上加事务注解,不管是否需要事务,都会创建事务,并且占用
如果不在方法上加事务注解,每一步都会自动提交到数据库,落磁盘

你可能感兴趣的:(spring事务注解)