2.spring事务三大接口介绍
2.1PlatformTransactionManager(平台)事务管理器
spring并不直接管理事务,而是提供了很多事务管理器,将事务管理职责委托给hibernate或者JTA等持久化机制所提供的相关平台框架事务来实现。
spring事务管理器的接口是org.springframework.transaction.PlatformTransactionManager
通过这个接口,spring为各个平台如hibernate,jdbc等提供了对应的事务管理器,怎么实现是各个平台自己的事情了。
public interface PlatformTransactionManager extends TransactionManager {
//获取事务状态
TransactionStatus getTransaction(@Nullable TransactionDefinition var1) throws TransactionException;
//事务提交
void commit(TransactionStatus var1) throws TransactionException;
//事务回滚
void rollback(TransactionStatus var1) throws TransactionException;
}
2.2TransactionDefinition事务定义信息(事务传播行为,隔离级别,超时,只读,回滚原则)
public interface TransactionDefinition {
//支持当前事务,若没有事务则创建一个事务
int PROPAGATION_REQUIRED = 0;
//如果存在当前事务,则加入事务,如果没有,则以非事务方式运行
int PROPAGATION_SUPPORTS = 1;
//如果存在当前事务,则加入事务,如果没有,则抛出异常
int PROPAGATION_MANDATORY = 2;
//创建一个新的事务,如果存在当前事务,则当前事务挂起
int PROPAGATION_REQUIRES_NEW = 3;
//以非事务方式运行,如果存在当前事务,则当前事务挂起
int PROPAGATION_NOT_SUPPORTED = 4;
//以非事务方式运行,如果存在当前事务,则抛出异常
int PROPAGATION_NEVER = 5;
/**表示如果当前有一个事务正在运行中,则该方法应用运行在一个嵌套的事务中
*被嵌套的事务可以独立运行于封装的事务进行提交或者回滚(保存点)
*如果封装事务不存在则 PROPAGATION_REQUIRES_NEW
**/
int PROPAGATION_NESTED = 6;
//使用后端数据库默认的隔离级别,oracle默认读已提交,mysql可重复度
int ISOLATION_DEFAULT = -1;
//最低的隔离级别,允许读取尚未提交的数据变更,可能会导致幻读、脏读或者不可重复读
int ISOLATION_READ_UNCOMMITTED = 1;
//允许读取并发事务已经提交的数据,避免脏读,但是不可避免幻读或者不可重复读
int ISOLATION_READ_COMMITTED = 2;
//对于多次读取同一条记录的结果是一致的,除非数据是被本身事务所修改,可以避免脏读和不可重复度,幻读可能发生
int ISOLATION_REPEATABLE_READ = 4;
//最高的隔离级别,完全服从ACID的隔离级别,所有的事务依次逐个执行,事务之间完全不可能产生干扰,避免脏读,幻读,不可重复度,但是性能最低
int ISOLATION_SERIALIZABLE = 8;
//使用默认的超时时间,事务进行时间大于设置时间就会抛异常,进行回滚
int TIMEOUT_DEFAULT = -1;
//获取事务的传播行为
default int getPropagationBehavior() {
return 0;
}
//获取事务的隔离级别
default int getIsolationLevel() {
return -1;
}
//获取事务的超时时间
default int getTimeout() {
return -1;
}
//获取事务的是否只读
default boolean isReadOnly() {
return false;
}
//获取事务的名称
@Nullable
default String getName() {
return null;
}
static TransactionDefinition withDefaults() {
return StaticTransactionDefinition.INSTANCE;
}
}
final class StaticTransactionDefinition implements TransactionDefinition {
static final StaticTransactionDefinition INSTANCE = new StaticTransactionDefinition();
private StaticTransactionDefinition() {
}
}
2.3TransactionStatus:事务运行状态
用来记录事务的状态,该接口定义了一组方法,用来获取或者判断事务的状态信息。
PlatformTransactionManager. getTransaction(........)返回一个TransactionStatus对象,返回的TransactionStatus对象可能代表一个新的或者已经存在的事务
public interface TransactionStatus extends TransactionExecution, SavepointManager, Flushable {
boolean hasSavepoint();
void flush();
}
接口继承关系如下
属性
构造器
所有方法
springboot注解
实现红框中的两个接口可以将组件注入spring,BeanPostProcessor在bean调用构造器实例化之前之后,后者是初始化前后。实现AOP所具有的功能