SpringBoot事务管理

1.Spring中的事务

Spring并不直接管理事务,而是通过各种事务管理器来调用特定平台的事务实现,用户在使用事务时不需要关心底层的实现。针对各个持久化场景,Spring提供了各个事务管理器,他们都继承了AbstractPlatformTransactionManager,实现了ResourceTransactionManager接口。这里面比较常用的事务管理器包括:

  1. DataSourceTransactionManager:用于JDBC的持久化支持,也可用于IBATIS
  2. HibernateTransactionManager:用于Hibernate3的持久化支持
  3. JpaTransactionManager:用于Java持久化API的持久化支持
  4. JtaTransactionManager:主要用于分布式事务的支持

2.事务的传播行为(propagation behavior)

传播行为定义了事务创建、启动或挂起的时机,以及某方法是否需要在事务环境下运行等。Spring提供了七种传播行为:

  1. PROPAGATION_MANDATORY:表示该方法必须在事务中运行,若当前事务不存在则抛异常。举例来说,一个service方法调用了两个dao方法,那么在执行其中的一个dao方法时,都要求已经启动了事务,否则需要抛异常。
  2. PROPAGATION_NESTED:表示若当前已存在一个事务,那么该方法将在嵌套事务中运行。嵌套事务可以独立于当前事务进行提交或回滚,若当前事务不存在,则该传播行为与PROPAGATION_REQUIRED一样。举例来说,一个service方法中调用了某dao方法,并且根据该dao方法执行的成功或失败区分了两套处理逻辑,这时候若dao执行失败,它只要保证不对数据库数据有任何影响(通过rollback)就可以了,不需要回滚整个service方法,故这个dao方法需要在嵌套事务中运行。
  3. PROPAGATION_NEVER:表示当前方法不应该运行在事务中,若当前已经有一个事务在运行,则抛异常。这种适用于在某些dao操作中,它要求之前的事务已经结束,而它本身的操作结果不会受到其他dao操作结果的影响(比如被其他操作所rollback)。
  4. PROPAGATION_NOT_SUPPORTED:表示当前方法不应该运行在事务中,若当前已经有一个事务在运行,则将其挂起。
  5. PROPAGATION_REQUIRED:表示当前方法必须运行在事务中,若当前存在事务,则在原有事务中运行,否则创建一个新的事务。
  6. PROPAGATION_REQUIRES_NEW:表示当前方法必须运行在自己的事务中,所以若存在当前事务,那么在该方法运行期间该事务会被挂起,以避免被其他方法使用,若不存在当前事务,则创建一个新的事务
  7. PROPAGATION_SUPPORTS:表示当前方法不需要事务上下文,但是若当前事务已经存在,那么该方法就在这个事务中运行

其实决定传播行为的关键点在于:1.该方法需不需要启动事务管理 2.事务边界和该方法自己的边界是否一样。

3.事务的隔离级别(isolation level)

在多个事务并发的情况下,一个事务不可避免的会受到其他事务执行结果的影响,包括脏读

(某事务读取了其他事务未提交的数据后,其他事务又将其数据回滚,导致该事务使用了无效的数据)

不可重复读

(某事务执行两次相同的查询操作,但是由于在这两次操作中间存在其他事务更新了数据,从而导致两次查询的结果不一致)

幻读

(某事务读取数据,在还未读取完的时候,其他事务又插入了一些新的数据,导致原事务数据多了一些原本不存在的数据,这在一定程度上引入了紊乱)

。若通过相关互斥机制保证事务的绝对隔离,则会很大程度影响并发的性能,最差情况就相当于事务是串行地执行。为了尽可能避免这些问题、权衡性能以及提高事务隔离的灵活性,Spring定义了五种隔离级别,以允许应用程序自己决定所能接受的、被其他事务所影响的程度。

  1. ISOLATION_DEFAULT: 使用底层数据库默认的隔离级别。

  2. ISOLATION_READ_UNCOMMITTED: 允许读取未提交的数据,这可能导致脏读、不可重复读和幻读。

  3. ISOLATION_READ_COMMITTED:允许读取已提交的数据,这可以避免脏读,但是还是可能导致不可重复读和幻读。

  4. ISOLATION_REPEATABLE_READ:对同一字段的多次读取结果是一致的,除非由本事务自己更新,这可以避免不可重复读和脏读,但是还是可能导致幻读。

  5. ISOLATION_SERIALIZABLE:完全按照ACID所要求的,可以避免脏读、不可重复读和幻读。注意:这种事务隔离级别的效率最差,因为它经常需要将事务相关的表进行加锁,锁粒度大。

4.SpringBoot中使用事务管理

4.1使用注解使用事务

	@Transactional(rollbackFor = {Exception.class})
    public void tran(){
        try {
            //事务
        }catch (Exception ex){
            throw ex;
        }
    }

4.2手动操作事务(推荐)

	@Autowired
    DataSourceTransactionManager transactionManager;

    public void tran(){
        //配置事务策略
        DefaultTransactionDefinition def=new DefaultTransactionDefinition();
        def.setName("money-transaction");
        //设置事务的传播行为
        def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);

        TransactionStatus status=transactionManager.getTransaction(def);
        transactionManager.commit(status);
        try {
            //事务
        }catch (Exception ex){
            transactionManager.rollback(status);
            throw ex;
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值