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. 事务资源释放