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” />)