Spring的事务管理

505 阅读3分钟

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则是定义事务拦截器,这样对应的类和方法就会被事务管理器所拦截了。