spring 事务传播机制

Spring 事务传播机制

  • REQUIRED(默认):支持使用当前事务,如果当前事务不存在,创建一个新事务。
  • SUPPORTS:支持使用当前事务,如果当前事务不存在,则不使用事务。
  • MANDATORY:中文翻译为强制,支持使用当前事务,如果当前事务不存在,则抛出Exception。
  • REQUIRES_NEW:创建一个新事务,如果当前事务存在,把当前事务挂起。
  • NOT_SUPPORTED:无事务执行,如果当前事务存在,把当前事务挂起。
  • NEVER:无事务执行,如果当前有事务则抛出Exception。
  • NESTED:嵌套事务,如果当前事务存在,那么在嵌套的事务中执行。如果当前事务不存在,则表现跟REQUIRED一样。
    Spring的事务传播机制的实现是通过注解@Transactional(propagation=Propagation.REQUIRED)来实现的。该注解的实现如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    @Target({ElementType.TYPE, ElementType.METHOD})
    @Retention(RetentionPolicy.RUNTIME)
    @Inherited
    @Documented
    public @interface Transactional {
    @AliasFor("transactionManager")
    String value() default "";

    @AliasFor("value")
    String transactionManager() default "";

    Propagation propagation() default Propagation.REQUIRED;

    Isolation isolation() default Isolation.DEFAULT;

    int timeout() default -1;

    boolean readOnly() default false;

    Class<? extends Throwable>[] rollbackFor() default {};

    String[] rollbackForClassName() default {};

    Class<? extends Throwable>[] noRollbackFor() default {};

    String[] noRollbackForClassName() default {};
    }
    其中该注解下的propagation 控制spring事务的传播机制;transactionManager则是控制具体事务的管理器,针对不同的数据库和ORM框架实现不同的事务管理,以便实现适应不同数据库事务的能力;Isolation,为控制数据库的默认事务隔离级别,不同数据的默认隔离级别不同,mysql的默认隔离级别为repeatable read,而oracle则为read commited。