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. 事务资源释放
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值