spring的事务处理

spring的事务处理

  1. 什么是事务

     在mysql中,提出了事务,事务是指一组sql语句的集合,集合中有多条sql语句
     可能是insert,update,select,delete,我们希望这些多个sql语句都能成功,
     或者都失败,这些sql语句的执行是一致的,作为一个整体执行。
    
  2. 在什么时候想到使用事务

     当我的操作涉及到多个表,或者多个sql语句的insert,update,delete,需要保证
     这些语句都是成功才能完成我的功能,或者都失败,保证操作是符合要求的。
     
     在java代码中写程序,控制事务,此时事务应该放在哪里?
     service类的业务方法上,因为业务方法会调用多个dao方法,执行多个sql语句
    
  3. 通常使用jdbc访问数据库,还有mybatis访问数据库怎么处理事务

     jdbc访问数据,处理事务 Conncotion conn; conn.commit(); conn.rollback();
     mybatis访问数据库,处理事务, SqlSession.commit(); SqlSession.rollback();
    
  4. 3中事务的处理方式有什么不足

    1. 不同的数据库访问技术,处理事务的对象,方法不同,
      需要了解不同数据库访问技术使用事务的原理
    2. 掌握多种数据库中事务的处理逻辑。什么时候提交事务,什么时候回滚事务
    3. 处理事务的多种方法。

    总结:就是多种数据库的访问技术,有不同的事务处理机制,对象,方法

  5. 怎么解决不足

     spring提供了一种事务处理模型,能使用统一的步骤(方式),完成多种不同的数据库访问技术的事务处理。
     使用spring的事务处理机制,可以完成mybatis访问数据库的事务处理。
     使用spring的事务处理机制,可以完成hibernate访问数据库的事务处理。
    
  6. 处理事务,需要怎么做,做什么

     spring处理事务的模型,使用的步骤是固定的,把事务的使用信息提供给spring就可以了
    
    1. 事务内部提交,回滚事务,使用的事务管理器对象,代替完成commit,rollback

      事务管理器是一个接口和它的众多实现类。

      接口:PlatformTransactionManager,定义了事务重要方法 commit,rollback

      实现类:spring把每一种数据库访问技术对应的事务处理器都创建好了。

      mybatis访问数据库------spring创建好的是DataSourceTransactionManager

      hibernate访问数据库-----spring创建好的是HibernateTransactionManager

      怎么使用:需要告诉spring,使用的是哪种数据库访问技术,
      声明数据库访问技术对应的是实现类,在spring的配置文件中使用声明就可以了

      例如:要使用mybatis访问数据库,应该在xml配置文件中

      <bean id="xxx" class="...DataSourceTransactionManager" />
      
    2. 业务方法需要什么样的事务,声明需要事务的类型。

      声明方法需要的事务:

      1. 事务的隔离级别:有4(+1个默认)个值

        1. READ_UNCOMMITTED:读未提交。为解决任何并发问题。
        2. READ_COMMITTED:读未提交。解决脏读,存在不可重复读与幻读。
        3. REPEATABLE_READ:可重复读。解决脏读,不可重复读,存在幻读。
        4. SERIALIZABLE:串行化。不存在并发问题。
      2. 事务的超时时间:表示一个方法最长的执行时间,如果方法执行时超过了时间,事务就回滚。
        单位是秒,整数值,默认是-1.(一般不设置,默认)

      3. 事务的传播行为:控制业务方法是不是有事务,是什么样的事务。

         7个传播行为,表示你的业务方法调用时,事务在方法之间时如何使用的。
         **PROPAGATION_REQUIRED**
         **PROPAGATION_REQUIRES_NEW**
         **PROPAGATION_SUPPORTS**
         以上三个需要掌握
         
         PROPAGATION_MANDATORY
         PROPAGATION_NESTED
         PROPAGATION_NEVER
         PROPAGATION_NOT_SUPPORTED
        
    3. 事务提交事务,回滚事务的时机

      1. 当你的业务方法,执行成功,没有异常抛出,当方法执行完毕,spring在方法执行后提交事务。
      2. 当你的业务方法抛出运行时异常或error,spring执行回滚,调用事务管理器的rollback。
        运行时异常的定义:RuntimeException和它的子类都是运行时异常
      3. 当业务方法抛出非运行时异常,主要是受检异常时,提交事务。
        受检异常:在写代码时必须处理的异常。

总结spring的事务:

  1. 管理事务的是 事务管理器和它的实现类

  2. spring的事务是一个统一模型

    1. 指定要使用的事务管理器的实现类,使用
    2. 指定哪些类,哪些方法需要加入事务的功能
    3. 指定方法需要的隔离级别,传播行为,超时

    你需要告诉spring,你的项目中类信息,方法的名称,方法的事务传播行为。

spring框架中提供的事务处理方案

  1. 适合中小项目,注解方案。
    spring框架自己调用aop实现给业务方法增加事务的功能,使用@Transactional注解增加事务。
    @Transactional注解是spring框架自己的注解,放在public方法的上面,表示当前方法具有事务。
    可以给注解的属性赋值,表示具体的隔离级别,传播行为,异常信息等等
    使用@Transactional注解的步骤:

    1. 需要上面事务管理器对象
         <bean id="xx" class="DataSourceTransactionManager"></bean>
      
    2. 开启事务注解驱动,告诉spring框架,我要使用注解的方式管理事务。
      spring使用aop机制,创建@Transactional注解所在的类代理对象,给对象加入事务的功能。
      spring给业务方法加入事务:
      在你的业务方法执行之前,先开启事务,在业务方法之后提交或回滚事务,使用aop的环绕通知。
    3. 在方法上加入@Transactional注解
  2. 适合大型项目,有很多的类,方法,需要大量的配置事务,使用aspectJ框架功能,在spring配置文件中
    声明类,方法需要的事务。这种方式,业务方法和事务配置完全分离

实现步骤:都是在xml配置文件中实现

  1. 要使用aspectJ框架,需要加入依赖
<dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aspects</artifactId>
      <version>5.2.5.RELEASE</version>
    </dependency>
  1. 声明事务管理器对象
    <bean id="xx" class="DataSourceTransactionManager">
  1. 声明方法需要的事务类型(配置方法的事务属性[隔离级别,传播行为,超时])
  2. 配置aop:指定哪些类需要创建代理。
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页