12. Spring事务控制(与数据库连接紧密)
12.1 编程式事务控制
1. PlatformTransactionManager
PlatformTransactionManager接口(不同的 Dao 层技术有不同的实现类)是spring的事务管理器,提供了常用的事务操作的方法
方法 | 说明 |
TransactionStatus getTransaction(TransactionDefination defination) | 获取事务的状态信息 |
void commit(TransactionStatus status) | 提交事务 |
void rollback(TransactionStatus status) | 回滚事务 |
2. TransactionDefinition
TransactionDefinition是事务的定义信息对象,其含有以下方法:
方法 | 说明 |
int getIsolationLevel() | 获得事务的隔离级别 |
int getPropogationBehavior() | 获得事务的传播行为 |
int getTimeout() | 获得超时时间 |
boolean isReadOnly() | 是否只读 |
2.1. 事务隔离级别
设置隔离级别,可以解决事务并发产生的问题,如脏读、不可重复读和虚读:
- ISOLATION_DEFAULT
- ISOLATION_READ_UNCOMMITTED(解决脏读)
- ISOLATION_READ_COMMITTED(解决不可重复读)
- ISOLATION_REPEATABLE_READ(都可以解决但是性能低下)
- ISOLATION_SERIALIZABLE
2.2事务传播行为(多个事务间的共同执行方式)
- REQUIRED:如果当前没有事务,就新建一个事务,如果存在一个事务,加入到这个事务中。(默认值)
- SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行(没有事务)
3. TransactionStatus
TransactionStatus接口提供的是事务具体的运行状态
方法 | 说明 |
boolean hasSavepoint() | 是否存储回滚点 |
boolean isCompleted() | 事务是否完成 |
boolean isNewTransaction() | 是否是新事务 |
boolean isRollbackOnly() | 事务是否回滚 |
12.2 基于XML的声明式事务控制
1. 什么是声明式事务控制
Spring的声明式事务顾名思义就是采用声明的方式来处理事务(通过配置的方式)。这种形式的事务管理不侵入开发的组件(及解耦)。Spring声明式事务控制底层思想就是AOP。
2.声明式事务控制的实现
1.基于XML实现
明确事项:
- 平台事务管理器
- 事务通知的配置(引用上面的事务管理器、还有一些参数)
- 事务aop的织入(aop:advisor)
<!--配置平台事务管理器-->
<bean id="" class="">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--通知 事务增强-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<!--设置事务的属性信息,tx:method可以有多个-->
<tx:attributes>
<tx:method name="" />
</tx:attributes>
</tx:advice>
<!--配置事务的aop织入-->
<aop:config>
<aop:advisor advice-ref="txAdvice" pointcut="execution()" />
</aop:config>
2.基于注解方式配置
- @Transactional(…) {isolation,timeout…}放在服务类前或者特定方法前
@Service
//类中所以方法都使用该配置
@Transactional(isolation=Isolation.REPEATABLE_READ)
public class ServiceImpl implements AccountService {
@Autowired
private Target target;
@Transcational(...) //只可用于下面的方法,且为最高优先级
public void method(...){
target.todo();
.......
}
}
- 在.xml文件中配置组件扫描(<context:scan />)和事务注解驱动(<tx:annotation-driven transaction-manager=“transactionManager” />)