分布式事务【3】【Spring的事务抽象】
程序员文章站
2022-05-09 15:59:39
...
1 Spring的事务抽象
- PlatformTransactionManager // 事务管理器
- TransactionDefinition //事务的一些基础信息,如超时时间、隔离级别、传播属性等
- TransactionStatus //事务的一些状态信息,如是否一个新的事务、是否已被标记为回滚
1.1 PlatformTransactionManager
public interface PlatformTransactionManager extends TransactionManager {
//根据事务定义TransactionDefinition获取事务
TransactionStatus getTransaction(TransactionDefinition var1);
//提交事务
void commit(TransactionStatus var1);
//回滚事务
void rollback(TransactionStatus var1);
}
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;
//...
}
事务传播机制
当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。例如:方法可能继续在现有事务中运行,也可能开启一个新事务,并在自己的事务中运行。
传播属性 |
描述 |
---|---|
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 使用代码方式实现
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 {};
}
上一篇: mysql 事务管理
下一篇: 事务(二)-----实现原理aop
推荐阅读
-
Spring的事务机制实例代码
-
Mybaits 源码解析 (十二)----- Mybatis的事务如何被Spring管理?Mybatis和Spring事务中用的Connection是同一个吗?
-
Spring 事务隔离与事务传播的详解与对比
-
spring事务的@Transactional使用事务不生效问题
-
Spring事务的开启原理详解
-
【面试】足够“忽悠”面试官的『Spring事务管理器』源码阅读梳理(建议珍藏)
-
Spring中的JDBCTemplate、Spring基于AOP的事务控制、Spring中的事务控制
-
Spring3.0配置多个事务管理器的方法
-
分布式事务之深入理解什么是2PC、3PC及TCC协议?
-
手把手带你实战下Spring的七种事务传播行为