Spring声明式事务注解@Transactional详解

Posted 筝子果

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring声明式事务注解@Transactional详解相关的知识,希望对你有一定的参考价值。

@Transactional事务注解源码如下

@Target(ElementType.TYPE, ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Transactional 
    @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 -1;

    String timeoutString() default "";

    boolean readOnly() default false;

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

    String[] rollbackForClassName() default ;

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

    String[] noRollbackForClassName() default ;

各属性详解

value:事务管理器名称;
transactionManager:同value,事务管理器名称,和value选配一个就行,或者都为空,默认从容器中查找事务管理器;
label:
propagation:事务的传播性;
isolation:事务的隔离级别;
timeout:事务超时时间;
readOnly:是否是只读事务;
rollbackFor:指定回滚事务的异常;
rollbackForClassName:指定回滚事务的异常类名;
noRollbackFor:指定不回滚事务的异常;
noRollbackForClassName:指定不回滚事务的异常类名;

声明式事务使用方式

通常我们使用@Transactional注解时,加在方法或者类上面,加在方法上表示当前方法需要以事务方式运行,加在类上面,表示此类下面所有方法都要以事务方式运行。

情形一

如果我们希望发生异常时,事务自动回滚,则配置如下属性

@Transactional(rollbackFor = Exception.class)

情形二

有时候我们在一个事务方法中,希望某个被调用的方法,以一个新的事务方式运行,我们可以配置如下propagation事务传播属性,表示新开启一个事务

@Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRES_NEW)

情形三

如果我们在进行一组操作时,每个操作都是一个事务,并且希望每个操作之间能够读取对方未提交的数据,则可进行如下isolation事务隔离级别的配置

@Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRES_NEW,isolation = Isolation.READ_UNCOMMITTED)

情形四

在事务方法中开启子线程时,子线程开启了新的事务,是否回滚不受当前方法的事务控制

    @Transactional(rollbackFor = Exception.classpublic void test()
        executor.execute(() -> 
            // 子线程业务代码
        );
    

事务失效场景

自调用失效

如下两个方法在同一个类中,test1方法的事务失效

    public void test()
        test1();
    
    
    @Transactional
    public void test1()
        
    

修饰非public方法

如下,修饰非public方法时,事务不生效

    @Transactional
    private void test()
        
    

拦截异常未抛出

如下方式异常被拦截未抛出,会导致事务不会回滚

    @Transactional(rollbackFor = Exception.class)
    public void test1()
        try 
            
         catch (Exception e)
            log.error("error");
        
    

以上是关于Spring声明式事务注解@Transactional详解的主要内容,如果未能解决你的问题,请参考以下文章

Spring 事务控制 -- 基于注解的声明式事务控制

Spring Transaction + MyBatis SqlSession事务管理机制研究学习

Springday03 AOPSpring声明式事务Spring编程式事务

Spring有几种事务管理,Spring事务管理接口是啥

java里声明式事务是啥意思呢?

Spring声明式事务注解@Transactional