文章

Spring事务

Spring事务

Transactional注解解析

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Transactional {
​
​
    //transactionManager的别名
    @AliasFor("transactionManager")
    String value() default "";
​
    //指定事务管理器
    @AliasFor("value")
    String transactionManager() default "";
​
    //事务标签
    String[] label() default {};
​
    //事务传播机制
    Propagation propagation() default Propagation.REQUIRED;
​
    //事务隔离级别
    Isolation isolation() default Isolation.DEFAULT;
​
    //超时时间 秒
    int timeout() default TransactionDefinition.TIMEOUT_DEFAULT;
​
    //超时时间 秒
    String timeoutString() default "";
​
    //只读事务
    boolean readOnly() default false;
​
    //回滚策略 指定某个/些异常回滚
    Class<? extends Throwable>[] rollbackFor() default {};
​
    //回滚策略 指定某个/些异常回滚 全限定类名称
    String[] rollbackForClassName() default {};
​
    //不回滚策略  指定某个/些异常不回滚
    Class<? extends Throwable>[] noRollbackFor() default {};
​
    //不回滚策略  指定某个/些异常不回滚 全限定类名称
    String[] noRollbackForClassName() default {};
​
}

spring事务传播

spring事务传播行为一共有7种:(前言: 当前事务指的是调用者自带的事务,A调用B,那么A就是当前事务)

  • REQUIRED (默认传播行为),支持当前事务,如果当前没有事务,就新建一个事务,这个当前事务指的是上一个方法的事务,是别人传递过去的,类似于重入锁,A方法和B方法都有事务,A方法调用B方法,A的事务会传递给B,使它们共用同一个事务
  • SUPPORTS 如果存在一个事务,支持当前事务,如果没有事务,则非事务执行,
  • REQUIRES_NEW 开启一个新的事务。如果一个事务已经存在,则先将这个存在的事务挂起
  • **MANDATORY 如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常 **
  • NOT_SUPPORTED 总是非事务地执行,并挂起任何存在的事务
  • NEVER 总是非事务地执行,不加入任何事务;
  • **NESTED 如果一个活动的事务存在,则运行在一个嵌套的事务中。 如果没有活动事务, 则按 REQUIRED 属性执行。 **
REQUIRED 如果有事务在运行,当前的方法就在这个事务内运行,否则,就启动一个新的事务,并在自己的事务内运行
SUPPORTS 如果有事务在运行,当前的方法就在这个事务内运行.否则它可以不运行在事务中
REQUIRES_NEW 当前的方法必须启动新事务,并在它自己的事务内运行.如果有事务正在运行,应该将它挂起
MANDATORY 当前的方法必须运行在事务内部,如果没有正在运行的事务,就抛出异常
NOT_SUPPORTED 当前的方法不应该运行在事务中。如果有运行的事务,将它挂起
NEVER 当前的方法不应该运行在事务中。如果有运行的事务,就抛出异常
NESTED 如果有事务在运行,当前的方法就应该在这个事务的嵌套事务内运行。否则,就启动一个新的事务,并在它自己的事务内运行.
License:  CC BY 4.0