美文网首页
Spring之Transactional注解

Spring之Transactional注解

作者: engineer_tang | 来源:发表于2022-03-09 08:09 被阅读0次

描述单个方法或类上的事务属性。
在类级别,此注解作为默认值应用于声明类及其子类的所有方法。注意,它不适用于类层次结构上的祖先类;方法需要在本地重新声明,以便参与子类级别的注解。
这种注解类型通常可以直接与org.springframework.transaction.interceptor.RuleBasedTransactionAttribute进行比较。实际上AnnotationTransactionAttributeSource将直接将数据转换为后一个类,这样Spring的事务支持代码就不必知道注解。如果没有与例外相关的规则,它将被视为DefaultTransactionAttribute 来看待(回滚RuntimeException和Error,但不回滚检查型的异常)。

1. 注解定义

该注解的签名如下:

@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 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 {};

}

1.1 rollbackFor属性

定义零(0)个或多个异常类,这些异常类必须是Throwable的子类,指示哪些异常类型必须导致事务回滚。
默认情况下,事务将在RuntimeException和Error上回滚,但不会在检查型异常(业务异常)上回滚。具体可以看DefaultTransactionAttribute.rollbackOn(Throwable)方法,有比较详细的解释。
这是构造回滚规则(与 rollbackForClassName比较)的首选方法,它匹配异常类及其子类。

1.2 rollbackForClassName属性

定义零(0)个或多个异常名称(对于必须是Throwable子类的异常),指示哪些异常类型必须导致事务回滚。
这可以是完全限定类名的子字符串,目前不支持通配符。例如,“ServletException”的值将与ServletException及其子类匹配。

1.3 noRollbackFor属性

定义零(0)个或多个异常类,这些异常类必须是Throwable的子类,指示哪些异常类型不能导致事务回滚。
这是构造回滚规则(与noRollbackForClassName相比)的首选方法,它匹配异常类及其子类。

1.4 readOnly属性

一个布尔标志,如果事务实际上是只读的,则可以将其设置为true,从而允许在运行时进行相应的优化。
默认为false。
这只是作为实际事务子系统的提示;它不一定会导致写入访问尝试失败。无法解释只读提示的事务管理器在请求只读事务时不会引发异常,而是默默地忽略该提示。

1.5 timeout属性

此事务的超时时间(秒)。
默认为基础事务系统的默认超时。为Propagation.REQUIRED和Propagation.REQUIRES_NEW设计的参数,因为它只适用于新启动的事务。默认值为-1,表示不设置超时时间。

1.6 timeoutString属性

此事务的超时时间(秒)。
默认为基础事务系统的默认超时。
专门设计用于Propagation.REQUIRED和Propagation.REQUIRES_NEW,因为它只适用于新启动的事务。

1.7 isolation属性

事务隔离级别。
默认为Isolation.DEFAULT.
专门为Propagation.REQUIRED 和 Propagation.REQUIRES_NEW设计使用的,因为它只适用于新启动的事务。如果您希望隔离级别声明在参与具有不同隔离级别的现有事务时被拒绝,请考虑在事务管理器上切换“验证有效事务”标志为“true”。

1.8 propagation属性

事务传播类型。
默认为 Propagation.REQUIRED.

1.9 label属性

定义零(0)个或多个事务标签。标签可用于描述事务 ,并可由单个事务管理器进行评估。标签可能仅用于描述目的,或映射到预定义的事务管理器特定选项。
请参阅实际事务管理器实现的描述,了解它如何评估事务标签。

1.10 transactionManager属性

指定事务的限定符值。
可用于确定目标事务管理器,与特定TransactionManager bean定义的限定符值(或bean名称)匹配。

2. propagation属性分析

propagation的取值定义成了一个枚举类,如下所示:

public enum Propagation {

    REQUIRED(TransactionDefinition.PROPAGATION_REQUIRED),

    SUPPORTS(TransactionDefinition.PROPAGATION_SUPPORTS),

    MANDATORY(TransactionDefinition.PROPAGATION_MANDATORY),

    REQUIRES_NEW(TransactionDefinition.PROPAGATION_REQUIRES_NEW),

    NOT_SUPPORTED(TransactionDefinition.PROPAGATION_NOT_SUPPORTED),

    NEVER(TransactionDefinition.PROPAGATION_NEVER),

    NESTED(TransactionDefinition.PROPAGATION_NESTED);

    private final int value;

    Propagation(int value) {
        this.value = value;
    }

    public int value() {
        return this.value;
    }

}

REQUIRED
其值为0,支持当前事务,如果不存在,则创建新事务。类似于同名的EJB事务属性。这是事务注解的默认设置。

SUPPORTS
其值为1,支持当前事务,如果不存在,则以非事务方式执行。类似于同名的EJB事务属性。
注意:对于具有事务同步的事务管理器,SUPPORTS 与完全没有事务略有不同,因为它定义了同步将应用的事务范围。因此,相同的资源(JDBC连接、Hibernate会话等)将在整个指定范围内共享。请注意,这取决于事务管理器的实际同步配置。

MANDATORY
支持当前事务,如果不存在则抛出异常。类似于同名的EJB事务属性。

REQUIRES_NEW
创建新事务,并暂停当前事务(如果存在)。类似于同名的EJB事务属性。
注意:实际的事务暂停不会在所有交易管理器上立即生效。这尤其适用于JtaTransactionManager。JtaTransactionManager,它需要TransactionManager 可供其使用(在标准Java EE中是特定于服务器的)。

NOT_SUPPORTED
以非事务方式执行,如果当前事务存在,则暂停当前事务。类似于同名的EJB事务属性。
注意:实际的事务暂停不会在所有事务管理器上立即生效。这尤其适用于JtaTransactionManager。JtaTransactionManager,它需要TransactionManager可供其使用(在标准Java EE中是特定于服务器的)。

NEVER
以非事务方式执行,如果存在事务,则抛出异常。类似于同名的EJB事务属性。

NESTED
如果存在当前事务,则在嵌套事务中执行,否则按要求执行。EJB中没有类似的特性。
注意:嵌套事务的实际创建只适用于特定的事务管理器。开箱即用,这只适用于JDBC DataSourceTransactionManager。一些JTA提供者可能也支持嵌套事务。

3. isolation属性

枚举,用来表示Transactional 注解的事务隔离级别,与TransactionDefinition 接口定义的事务隔离级别相一致。
枚举定义如下:

public enum Isolation {

    DEFAULT(TransactionDefinition.ISOLATION_DEFAULT),

    READ_UNCOMMITTED(TransactionDefinition.ISOLATION_READ_UNCOMMITTED),

    READ_COMMITTED(TransactionDefinition.ISOLATION_READ_COMMITTED),

    REPEATABLE_READ(TransactionDefinition.ISOLATION_REPEATABLE_READ),

    SERIALIZABLE(TransactionDefinition.ISOLATION_SERIALIZABLE);

    private final int value;

    Isolation(int value) {
        this.value = value;
    }

    public int value() {
        return this.value;
    }

}

DEFAULT
使用基础数据存储的默认隔离级别。所有其他级别都对应于JDBC隔离级别。

READ_UNCOMMITTED
一个常数,指示可能发生脏读、不可重复读和幻象读。此级别允许一个事务更改的行在提交该行的任何更改之前被另一个事务读取(“脏读”)。如果回滚了任何更改,则第二个事务将检索到无效行。

READ_COMMITTED
指示防止脏读的常数;可能会发生不可重复读取和幻象读取。此级别仅禁止事务读取包含未提交更改的行。

REPEATABLE_READ
指示防止脏读和不可重复读的常数;可能会发生幻象读取。该级别禁止事务读取包含未提交更改的行,还禁止一个事务读取一行,第二个事务更改该行,第一个事务重新读取该行,第二次获得不同的值(“不可重复读取”)。

SERIALIZABLE
一个常数,指示防止脏读、不可重复读和幻象读。该级别包括隔离可重复读取的禁止,并进一步禁止一个事务读取满足where条件的所有行,第二个事务插入满足where条件的行,第一个事务重新读取相同条件,在第二次读取中检索附加的“幻影”行。

相关文章

网友评论

      本文标题:Spring之Transactional注解

      本文链接:https://www.haomeiwen.com/subject/dvttdrtx.html