Spring框架--Spring事务管理和Spring事务传播行为

Posted 肖帆咪

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring框架--Spring事务管理和Spring事务传播行为相关的知识,希望对你有一定的参考价值。

Spring框架往期文章

Spring事务管理

事务可以看做是由对数据库若干操作组成的一个单元

作用:保证用户的每一个操作都是可靠地,每一个操作都必须成功,只要发生异常就回退到事务未操作的状态,要么都完成,要么都取消,保证一致性的要求

事物的特性:原子性 隔离性 持久性 一致性

Spring事务管理分两种类型:

1.编程式事务:在代码中需要自己写代码实现事物的提交和回滚

2.声明式事务:只要生命哪个方法需要在事务中执行,Spring就会知道添加事物的提交和回滚操作


Spring事务管理方式:

1.基于xml配置

<1.>xml方式配置

    <!--xml方式配置spring对事物管理-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

    <!-- spring事务传播行为-->
     <tx:advice id="txadvice" transaction-manager="transactionManager">
         <tx:attributes>
             <tx:method name="save*" propagation="REQUIRED"/>
         </tx:attributes>
     </tx:advice>
     <aop:config>
         <!-- save方法需要增强 -->
         <aop:pointcut id="save" expression="execution(* com.spring0.dao.UserDao.save(..))"/>
         <aop:advisor advice-ref="txadvice" pointcut-ref="save"></aop:advisor>
     </aop:config>
2.基于注解实现
 <!--xml方式配置spring对事物管理-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

    <!--开启注解的事务管理-->
    <tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>

通过注解@Transactional 标记需要事务管理得方法,一般在service层进行注解

@Service
//@Transactional//@Transactional添加在类上,表示此类中所有方法都在事务管理中进行
public class Usersrvice {


    @Autowired
    UserDao userDao;


    @Transactional
    public void save() {
        userDao.save1();
        //System.out.println(10/0);
        userDao.save2();
    }

}

Spring事务传播行为

当一个事务方法被另一个事务方法调用时,这个十五方法应该如何进行.

它是Spring框架独有的事务增强特性,不属于事务实际提供方数据库行为

Spring 定义了七种传播行为:

在这里插入图片描述

我们详细介绍三种传播行为

  1. PROPAGATION_REQUIRED
    指定的方法必须在事务内执行,若当前存在事务,加入到当前事务中,若当前没有事务,则创建一个新事务,这种传播行为是最常见的,也是spring 默认的传播行为

A事务方法 调用B事务方法,B的事务会合并到A事务中,若B事务出现异常,A事务也会回滚

A方法(没有事务)调用B事务方法,那么B方法会开启自己的事务,在事务中执行

在这里插入图片描述

  1. PROPAGATION_SUPPORTS
    支持当前事务,如果当前没有事务,就以非事务方式执行。

A事务方法 调用B方法,那么B方法就会合并到A事务中,若B事务出现异常,A事务也会回滚

A方法(没有事务)调用B方法,那么B方法就不在spring管理的事务中执行(在JdbcTemplate事务执行)

在这里插入图片描述

  1. PROPAGATION_REQUIRES_NEW
    总是新建一个事务,如果当前存在事务,把当前事务挂起,直到新建的事务结束

A事务方法 调用B方法,那么B方法会单独开启一个事务执行,A出现异常不影响B方法的事务

A方法(没有事务)调用B方法,那么B还会单独的开启一个事务,A方法的异常不影响B事务

在这里插入图片描述

声明式事务不生效的场景

  1. @Transactional 应用在非 public 修饰的方法上
  2. @Transactional 注解属性 propagation 设置错误
  3. 同一个类中方法调用,导致@Transactional 失效
  4. 异常被 catch 捕获导致@Transactional 失效
  5. 数据库引擎不支持事

以上是关于Spring框架--Spring事务管理和Spring事务传播行为的主要内容,如果未能解决你的问题,请参考以下文章

学习笔记--Spring框架

spring

Spring集成使用工作流框架Activiti!事务配置,注解配置以及流程资源自动化部署

Spring 框架介绍和使用

Spring概述

Spring事务管理实现原理及MySQL InnoBD引擎行锁概述