欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

分布式事务【3】【Spring的事务抽象】

程序员文章站 2022-05-09 15:59:39
...

1 Spring的事务抽象

  • PlatformTransactionManager // 事务管理器
  • TransactionDefinition //事务的一些基础信息,如超时时间、隔离级别、传播属性等
  • TransactionStatus //事务的一些状态信息,如是否一个新的事务、是否已被标记为回滚

分布式事务【3】【Spring的事务抽象】

1.1 PlatformTransactionManager

public interface PlatformTransactionManager extends TransactionManager {
    //根据事务定义TransactionDefinition获取事务
    TransactionStatus getTransaction(TransactionDefinition var1);
    //提交事务
    void commit(TransactionStatus var1);
    //回滚事务
    void rollback(TransactionStatus var1);
}

分布式事务【3】【Spring的事务抽象】

1.2 TransactionDefinition  

事务的隔离级别是数据库本身的事务功能,事务的传播属性则是Spring为我们提供的功能

public interface TransactionDefinition {
    //---------------隔离机制---------------------------------------------------
    // 默认隔离机制(和数据库保持一致)
    ISOLATION_DEFAULT
    // 读未提交
    ISOLATION_READ_UNCOMMITTED
    // 读已提交
    ISOLATION_READ_COMMITTED
    // 可重复读
    ISOLATION_REPEATABLE_READ
    // 线性读
    ISOLATION_SERIALIZABLE
    //---------------传播机制---------------------------------------------------
    // 支持当前事务;如果A方法已经在事务中,则B事务将直接使用;否则将创建新事务(默认)
    PROPAGATION_REQUIRED
    // 支持当前事务;如果A方法已经在事务中,则B事务将直接使用;否则将以非事务状态执行
    PROPAGATION_SUPPORTS
    // 支持当前事务;如果A方法没有事务,则抛出异常
    PROPAGATION_MANDATORY
    // 将创建新的事务,如果A方法已经在事务中,则将A事务挂起
    PROPAGATION_REQUIRES_NEW
    // 不支持当前事务,总是以非事务状态执行;如果A方法已经在事务中,则将其挂起
    PROPAGATION_NOT_SUPPORTED
    // 不支持当前事务,如果A方法在事务中,则抛出异常
    PROPAGATION_NEVER
    // 嵌套事务,底层将使用Savepoint形成嵌套事务
    PROPAGATION_NESTED
    //-------------------------------------------------------------------------
    // 获取事务的传播属性
    int getPropagationBehavior();
    // 获取事务的隔离级别
    int getIsolationLevel();
    // 获取事务的名字
    String getName();
    // 获取事务的超时时间
    int getTimeout();
    // 事务是否是只读
    boolean isReadOnly();
}

TransactionDefinition的实现DefaultTransactionDefinition,默认的事务定义

//org.springframework.transaction.support
public class DefaultTransactionDefinition implements TransactionDefinition{
    //事务的传播属性为PROPAGATION_REQUIRED,即当前没有事务的时候创建一个,如果有则使用当前事务 
    private int propagationBehavior = PROPAGATION_REQUIRED;
    //事务的隔离级别采用底层数据库默认的隔离级别 
    private int isolationLevel = ISOLATION_DEFAULT;
    //超时时间采用底层数据库默认的超时时间
    private int timeout = TIMEOUT_DEFAULT;
    //是否只读为false
    private boolean readOnly = false;
    //...
}

事务传播机制

当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。例如:方法可能继续在现有事务中运行,也可能开启一个新事务,并在自己的事务中运行。

事务传播机制(https://blog.csdn.net/qq_40794973/article/details/97522518 | https://www.jianshu.com/p/c8140591a2a1  )

传播属性

描述

REQUIRED

如果有事务在运行,当前的方法就在这个事务内运行;否则就启动一个新的事务,并在自己的事务内运行(默认)

REQUIRES_NEW 当前的方法必须启动新事务,并在它自己的事务内运行;如果有事务正在运行,应该将它挂起
SUPPORTS 如果有事务在运行,当前的方法就在这个事务内运行;否则它可以不运行在事务中
NOT_SUPPORTED 当前的方法不应该运行在事务中;如果有运行的事务,将它挂起
MANDATORY 当前的方法必须运行在事务内部;如果没有正在运行的事务,就抛出异常
NEVER 当前的方法不应该运行在事务中;如果有运行的事务,就抛出异常
NESTED  如果有事务在运行,当前的方法就应该在这个事务的嵌套事务内运行;否则就启动一个新的事务,并在它自己的事务内运行

1.3 TransactionStatus

//事务在运行中的状态
//TransactionStatus它继承了SavepointManager接口,SavepointManager是对事务中上述保存点功能的封装
//TransactionStatus本身更多存储的是事务的一些状态信息
public interface TransactionStatus extends TransactionExecution, SavepointManager, Flushable {
    // 是否是新的事务
    boolean isNewTransaction();
    // 是否有恢复点
    boolean hasSavepoint();
    // 设置为只回滚
    void setRollbackOnly();
    // 是否为只回滚
    boolean isRollbackOnly();
    // 是否已完成
    boolean isCompleted();
}

2 在Spring中使用事务

2.1 使用代码方式实现

分布式事务【3】【Spring的事务抽象】

2.2 Transactional标签方式实现

//javax.transaction.Transactional ×
//org.springframework.transaction.annotation.Transactional √
public @interface Transactional {
	// 当在配置文件中有多个TransactionManager , 可以用该属性指定选择哪个事务管理器
	@AliasFor("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;
	// 指定事务是否为只读事务,默认值为false(为了忽略那些不需要事务的方法,比如读取数据,可以设置 read-only 为 true)
	boolean readOnly() default false;
	// 用于指定能够或不能够触发事务回滚的异常类型(多个逗号分隔)
	Class<? extends Throwable>[] rollbackFor() default {};
	String[] rollbackForClassName() default {};
	Class<? extends Throwable>[] noRollbackFor() default {};
	String[] noRollbackForClassName() default {};
}

分布式事务【3】【Spring的事务抽象】

分布式事务【3】【Spring的事务抽象】

相关标签: 事务