SSM-Spring-数据库事务管理-声明式事务

SSM-Spring-数据库事务管理-声明式事务

​ Spring的声明式事务顾名思义就是采用声明的方式来处理事务。这里的声明指的是配置文件中的声明。用配置文件中声明的事务来代替代码式的处理事务。

​ 编程式事务允许自定义事务接口,TransactionDefinition,它可以由XML和注解进行配置。


Transaction的配置项

配置项 含义 备注
value 定义事务管理器 它是SpringIOC容器里的一个Bean id,这个Bean需要实现接口PlatformTransactionManager
transactionManager 同上 同上
isolation 隔离级别 这是一个数据库在多个事务同时存在时的概念。默认值取数据库默认隔离级别
propagation 转播行为 传播行为是方法之间调用的问题,默认值为Propagation.REQUIRED
timeout 超时时间 单位为秒,当超时时,会引发异常,默认会导致事务回滚
readOnly 是否开启只读事务 默认false
rollbackFor 回滚事务的异常类定义 也就是只有当方法产生所定义异常时,才回滚事务,否则就提交事务
rollbackForClassName 回滚事务的异常类名定义 同上,只是使用类名称定义
noRollbackFor 当产生哪些异常不回滚事务 当产生所定义异常时, Spring 将继续提交事务
noRollbackForClassName 同上 同上,只是使用类的名称定义

这些内容会被Spring放到事务定义类TransactionDefinition,事务声明器的配置内容也是以这些为主

注意:使用声明式事务需要配置注解驱动,如下配置就能使用@Transactional配置事务

  <tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>

使用XML进行配置事务管理器

​ 事务拦截器TransactionInterceptor:

<bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
    <property name="transactionManager" ref="transactionManager"/>
    <!--配置事务属性-->
    <property name="transactionAttributes">
        <props>
            <!-- key代表是业务方法的正则表达式,而其他内容可以配置各类事务定义参数-->
            <prop key="insert*">PROPAGATION_REQUIRED,ISOLATION_READ_UNCOMMITTED</prop>
            <prop key="save*">PROPAGATION_REQUIRED,ISOLATION_READ_UNCOMMITTED</prop>
            <prop key="add*">PROPAGATION_REQUIRED,ISOLATION_READ_UNCOMMITTED</prop>
            <prop key="select*">PROPAGATION_REQUIRED,readOnly</prop>
            <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
            <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
            <prop key="del*">PROPAGATION_REQUIRED,IOSLATION_READ_UNCOMMITTED</prop>
            <prop key="remove*">PROPAGATION_REQUIRED,IOSLATION_READ_UNCOMMITTED</prop>
            <prop key="update*">PROPAGATION_REQUIRED,IOSLATION_READ_UNCOMMITTED</prop>
        </props>
    </property>
</bean>

​ 重点:在于配置transactionAttributes的内容,SpringIOC启动会解析这些内容,放到事务定义类TransactionDefinition中,在运行根据正则表达式的匹配度决定采取哪种策略,

​ 上面只是Spring方法采取的事务策略,还需要告知spring拦截哪个类,因此需要在配置一个类:

    <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
        <property name="beanNames">
            <list>
                <value>*ServiceImpl</value>
            </list>
        </property>
        <property name="interceptorNames">
            <list>
                <value>transactioninterceptor</value>
            </list>
        </property>
    </bean>

beanNames属性告诉Spring如何拦截,interceptorNames属性则是定义事务拦截器


事务定义器

接口内容:

public interface TransactionDefinition {
    
    
    //转播行为常量定义(7个)
    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;
    //隔离级别定义(5个)
    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;
	//获取传播行为
    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;
    }
}

​ 事务定义器内容,除了异常的定义,都可以在这里完成,事务回滚内容,它以RollbackRuleAttribute和NoRollbackRuleAttribute两个类进行保存,事务拦截器中就可以根据配置的内容来处理事务方面的内容


声明式事务的约定流程

1. spring容器启动完成,解析事务管理的内容,存放到事务定义器之内
2. 根据事务定义器,设置事务属性
3. 执行开发者的代码逻辑
4. 异常且满足事务回滚配置条件:是:事务回滚,否:事务提交
5. 事务资源释放

猜你喜欢

转载自blog.csdn.net/weixin_43958223/article/details/115352684