在之前简单介绍了spring事务的用法,在spring中,事务的传播属性和隔离级别比较多,因此抽出来,单独写一篇来解释

注意:@Transactional 只能被应用到public方法上, 对于其它非public的方法,如果标记了@Transactional也不会报错,但方法没有事务功能。

为了方便使用,直接使用注解配置spring事务,Ctrl+单击

spring事务注解配置解析_it技术打开注解,我们可以看到这个注解内的方法属性,

spring事务注解配置解析_java_02

下面我们来解释常用几个属性的取值:

package com.zs.service;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.core.annotation.AliasFor;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Transactional {
    @AliasFor("transactionManager")
    String value() default "";

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

    /**
     * 事务传播特性:
     * Propagation.REQUIRED     判断当前方法是否存在事务,如果不存在就创建一个新的事务,如果存在就使用当前的事务
     * Propagation.REQUIRES_NEW 判断当前方法是否存在事务,如果不存在事务就创建一个新的事务,
     *                             如果存在事务,就把当前事务挂起,在启动一个新的事务
     * Propagation.NESTED       嵌套事务。判断当前方法是否存在事务,如果不存在就创建一个事务,如果存在事务就把当前事务挂起,
     *                              再启动一个当前事务的子事务,这样如果父事务产生异常,那么即使子事务没有异常也会回滚。
     * Propagation.NEVER        当前方法不应该运行在事物中,如果有事务就抛出异常;
     * Propagation.NOT_SUPPORTED当前方法不应该有事务,如果有事务存在,将它挂起,以无事务状态运行
     * Propagation.MANDATORY    当前方法必须要在有事务方法中运行,不然就抛出异常;如果有事务,就加入当前事务。
     * Propagation.SUPPORTS     支持事务,如果有事务,就加入事务中,如果没有事务,就以无事物的方式运行;
     * @return
     */
    Propagation propagation() default Propagation.REQUIRED;

    /**
     * 设置隔离级别
     * Isolation.DEFAULT            底层数据存储的默认隔离级别,sqlServer与oracle默认为已提交读
     * Isolation.READ_COMMITTED     已提交读    读取已提交数据(会出现不可重复读和幻读)
     * Isolation.READ_UNCOMMITTED   未提交读    读取未提交数据(会出现脏读, 不可重复读) 基本不使用;
     * Isolation.REPEATABLE_READ    可重复读    可重复读(会出现幻读);在一个事务中进行查询时,
     *                                          不允许读取其他事务update的数据,允许读取到其他事务提交的新增数据
     * Isolation.SERIALIZABLE       序列化
     * @return
     */
    Isolation isolation() default Isolation.SERIALIZABLE;

    /**
     * 该属性用于设置事务的超时秒数,默认值为-1表示永不超时
     * @return
     */
    int timeout() default -1;

    /**
     * 设置当前事务是否为只读事务,设置为true表示只读,false表示可读写,默认为false,
     * 如果当前事务为查询操作,可以设置为true,可以提高程序运行效率
     * @return
     */
    boolean readOnly() default false;

    /**
     * 该属性用于设置需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,则进行事务回滚。
     * 如:@Transactional(rollbackFor = {NullPointerException.class,RuntimeException.class})
     * 表示空指针异常和运行时异常时回滚事务
     * @return
     */
    Class<? extends Throwable>[] rollbackFor() default {};

    /**
     * 该属性用于设置需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,则进行事务回滚。
     * 与上面的区别就是,直接写异常名字,不需要写.class
     * 如:@Transactional(rollbackForClassName = {"NullPointerException","Exception"})
     * @return
     */
    String[] rollbackForClassName() default {};

    /**
     * 该属性用于设置不需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,不进行事务回滚。
     * 如:@Transactional(noRollbackFor = {NullPointerException.class})
     * 表示当抛出空指针异常时,不回滚事务
     * @return
     */
    Class<? extends Throwable>[] noRollbackFor() default {};

    /**
     * 该属性用于设置不需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,不进行事务回滚。
     * 如:@Transactional(noRollbackForClassName = {"NullPointerException","Exception"})
     * 很容易发现,与上面的两组是相对的,上面的是发生指定异常回滚,下面的是发生指定异常不回滚
     * @return
     */
    String[] noRollbackForClassName() default {};
}