Spring中@Transactional注解到底做了什么(一)------@Transactional接口

首先我们直接先看@Transactional注解的代码,注解接口中的关键字也是平常在@Transactional注解使用时,按照需求可以设置的关键字

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Transactional {

    @AliasFor("transactionManager")
  //AliasFor指的是value和transactionManager互为别名
    String value() default "";

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

    //事务传播类型
    Propagation propagation() default Propagation.REQUIRED;

    //事务隔离级别
    Isolation isolation() default Isolation.DEFAULT;

    //事务的超时时间
    int timeout() default TransactionDefinition.TIMEOUT_DEFAULT;

    //事务只读
    boolean readOnly() default false;

    //事务回滚的异常类型
    Class<? extends Throwable>[] rollbackFor() default {};
    
    String[] rollbackForClassName() default {};

    //事务不回滚的异常类型
    Class<? extends Throwable>[] noRollbackFor() default {};
    
    String[] noRollbackForClassName() default {};
}

在这里的重点关键字主要是传播类型和隔离级别

传播类型

传播类型主要有七种
(1)required :如果存在一个事务,则支持当前事务。如果没有事务则开启一个新的事务。
(2) requires_new: 新建事务,如果当前存在事务,把当前事务挂起。
(3) Supports: 支持当前事务,如果当前没有事务,就以非事务方式执行。
(4) not_Supported: 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
(5) NEVER :以非事务方式执行,如果当前存在事务,则抛出异常。
(6) nested:嵌套事务。
(7) mandatory: 支持当前事务,如果当前没有事务,则抛出异常。

关于不同的传播类型,spring会怎么处理?在后面我们会按照源码流程进行解析

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容