Spring事务管理-编程式事务管理
spring支持编程式事务和声明式事务,spring使用的事务管理器,每个不同的平台的事务管理器都实现了接口:PlatformTransactionManager。
spring并不是直接管理事务,而是通过提供了多种事务管理器,他们是将事务管理器的职责交给Hibernate和Mybatis这种持久化框架提供相关的平台框架的事务来实现。PlatformTransactionManager是事务管理的核心,提供了三个需要实现的函数:
①、commit(TransactionStatus var1)
②、getTransaction(@Nullable TransactionDefinition var1)
③、rollback(TransactionStatus var1)
我们使用了JDBC来处理事务,那么事务管理器就是DataSourceTransactionManager。其需要DataSource类,也就是实现了javax.sql.DataSource这个接口的类,就作为参数传入到DataSourceTransactionManager。然后找到包org.springframework.transaction.support中的TransactionTemplate。
TransactionTemplate模板类
execute(TransactionCallback action);可以利用这个方法,在这个方法中添加事务。 TransactionCallback中doInTransaction(TransactionStatus status), TransactionStatus参数通常是用于调用回滚的。 Spring事务管理涉及到接口联系图:
TransactionTemplate模板类是用于简化事务管理器,事务管理由模板定义,而具体操作通过回调接口指定,通过调用模板类的execute方法来自动享受事务管理,参数类型为 TransactionCallback 或者 TransactionCallbackWithoutResult
实际运用 Service中需要spring事务管理的部分应该使用TransactionTemplate模板类来包装执行。
事务属性
事务状态定义接口TransactionDefinition,定义了事务各个状态的定义
`
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;
int PROPAGATION_NESTED = 6;
int ISOLATION_DEFAULT = -1;
int ISOLATION_READ_UNCOMMITTED = 1;
int ISOLATION_READ_COMMITTED = 2;
int ISOLATION_REPEATABLE_READ = 4;
int ISOLATION_SERIALIZABLE = 8;
int TIMEOUT_DEFAULT = -1;
//获取事务的传播行为
int getPropagationBehavior();
//获取隔离级别
int getIsolationLevel();
//返回事务超时时长
int getTimeout();
//事务是否只读
boolean isReadOnly();
@Nullable
String getName();
}
Spring事务的传播机制
Spring隔离级别
只读、超时、回滚规则、事务状态。
public interface TransactionStatus extends SavepointManager, Flushable {
//是否是新的事务
boolean isNewTransaction();
//是否有恢复点
boolean hasSavepoint();
//设置为只回滚
void setRollbackOnly();
//是否已回滚
boolean isRollbackOnly();
//是否刷新
void flush();
//是否已完成
boolean isCompleted();
}
声明式事务
spring的声明式事务的实现方式采用 @Transactional注解来实现,使用xml来配置声明
<tx:annotation-driven transaction-manager="transactionManager"/> 利用XML配置事务管理器的方法很多,但是也不常用,更多的时候我们会采用注解的方式来实现事务,它需要一个事务拦截器--TransactionInterceptor,配置事务拦截器。
配置transactionAttributes的内容是需要关注的重点,Spring IoC启动时会解析这些内容,放到事务定义类Transac-tionDefinition中,再运行时会根据正则式的匹配度决定方法采取哪种策略。显然这使用了拦截器和Spring AOP的编程技术,这也揭示了声明式事务的底层原理——Spring AOP技术。
还需要告诉Spring哪些类要使用事务拦截器进行拦截,为此我们再配置一个类BeanNameAutoProxyCreator。
BeanName属性告诉Spring如何拦截类。由于声明为*ServiceImpl,所有关于Service是现实类都会被其拦截,然后interceptorNames则是定义事务拦截器,这样对应的类和方法就会被事务管理器所拦截了。