美文网首页
第五章 Spring 事务

第五章 Spring 事务

作者: 水墨九 | 来源:发表于2022-01-16 12:06 被阅读0次

    5.1事务

    1、什么是事务?一些sql语句序列的集合,是多条sql,要作为一个整体来执行,要么全部成功,要么全部失败。

    mysql执行事务:
    beginTransaction//开始事务
    insert into student ....;
    select * from student ......
    endTransaction//事务结束
    

    2、什么时候需要使用事务?
    一个操作需要多条(2条或者2条以上的sql),sql语句一起完成,操作才能完成。

    5.2 在程序中事务在哪里说明

    加载业务类的方法上面(public方法上面),表示业务放大执行时,需要事务的支持。

    5.3 事务管理器

    5.3.1不同的数据库访问技术,处理事务的方式是不同的

    1)使用jdbc访问数据库,事务处理

    public void Account(){
    Connecton con = ..
    con.setAutoCommit(false);
    stat.insert();
    stat.update;
    con.commit();
    con.setAutoCommit(true);
    }
    

    2)mybatis执行数据库操作,处理事务

    public void updateAccount(){
        SqlSession session = SqlSession.openSession(false);
        try{
              session.insert("insert into ...");
              session.update("update ...");
              session.commit();
        }catch(Exception e){
          session.rollback():
        }
        
    }
    

    5.3.2 spring统一事务管理事务,把不同的数据库访问技术的事务处理统一起来

      使用spring的事务管理器,管理不同的数据库访问技术的事务处理,开发人员只需要掌握spring的事务处理一个方案,就可以实现使用不同的数据库访问技术的事务管理。
      管理事务面向的是spring,有spring管理事务,做事务的提交,事务的回滚。

    5.3.3 Spring事务管理器

    Spring框架使用事务管理器来管理事务,
    事务管理器接口:PlatFormTransactionManager
    作用:定义了事务的操作,主要是commit(),rollback()
    事务管理器有很多实现类:一种数据库的访问技术有一个实现类,由实现类具体完成事务的提交、回滚
    意味着:jdbc或者mybatis访问数据库有自己的事务管理器实现类:DATASourceTransactionManager
    hibernate框架,他的事务管理器实现类:HibernateTransactionManager
    事务管理器的工作方式:


    事务管理的工作方式

    5.3.4 事务的提交和回滚时机

    什么时候提交、回滚事务?
    当业务方法正常执行时,没有异常,事务自动提交。如果业务方法抛出了运行时异常,事务是回滚的。
    异常的分类:
    Error:严重错误,回滚
    Exception:异常类,可以处理的异常情况
    1、运行时异常:RuntimeException和他的子类都是运行时异常,在程序执行过程中抛出的异常。常见的运行时异常:NullPointException,NumberFormatException,IndexBoundException.......
    2、受查异常:在编写java代码的时候,必须要处理的异常,例如:IOException,SQLException,FileNotFoundException....,受查异常默认是提交事务
    总结
    方法中抛出了运行时异常,回滚;其他情况(正常执行方法、受查异常)就提交事务

    5.3.5 事务使用的AOP的环绕通知

    环绕通知:在目标方法的前和后都能增强功能,不需要修改代码。

    //spring给业务方法在执行时,增加上事务的切面方法
    @Around("execution(  所有的业务方法类中的方法)")
    public Object myAround(ProceedingJointPoint pjp){
         try{ 
                  PlatformTransactionManager.beginTransaction()//使用spring的事务管理器去开启事务
                  pjp.proceed();//执行目标方法
                  PlatformTransactionManager.commit();//业务方法正常执行,提交事务
          }catch(Exception e ){
                 PlatformTransactionManager.rollback();//回滚
          }
    }
    

    5.4 事务定义接口TransactionDefinition

    该接口定义了三类常量,定义了有关事务控制的属性
    事务的属性:
    1、隔离级别
    2、传播行为
    3、事务的超时
    给业务方法说明事务的属性和ACID不一样

    5.4.1 隔离级别

    控制事务之间影响程度的,有5个值,但实际只有4个隔离级别
    1、default:采用DB默认的事务隔离级别。MySql的默认为repeatable_read,orcal的默认为:read_committed
    2、read_uncommitted:读未提交。未解决任何并发问题
    3、read_committed:读已提交。解决脏读、存在不可重复读与幻读
    4、repeatable_read:可重复读,解决脏读、不可重复读、存在幻读
    5、serializable:串行化,不存在并发问题(事务安全性最高,但是效率最低)

    5.4.2 事务的超时时间

    事务的超时时间是以秒为单位的,默认为-1。该时间是表示一个业务方法最长的执行时间。到达时间没有执行完毕,spring回滚事务。-1表示没有时间限制。

    5.4.3传播行为

    传播行为有7个值
    传播行为:业务方法在调用时,事务在方法之间的传递和使用
    使用传播行为,标志方法有无事务
    1、propagation_required:Spring默认的传播行为,方法在调用的时候,如果存在事务,则使用当前的事务,如果没有事务,则新建事务,方法在新建事务中执行
    2、propagation_supports:有事务可以执行,没有事务也可以执行(比如:查询操作)
    3、propgation_required_new:方法需要一个新事务。如果在调用方法时,则原来的事务暂停,知道新事务执行完毕。如果方法调用时,没有事务,则新建一个事务,在新事务中执行代码。

    5.5 Spring框架使用自己的注解Transactional控制事务

    @Transactional注解,使用注解的属性来控制事务(隔离级别、传播行为、超时)

    • 属性:
      1、prooagation:事务的传播行为,他使用的是propagation类的枚举值。例如:propagation.required
      2、isolation:表示隔离级别,使用isolation类的枚举值,表示隔离级别
      3、readOnly:boolean类型的值,表示数据库操作是不只读的,默认是false。
      4、timeout:事务的超时时间,默认-1,整数值,单位是秒。例如timeout=20
      5、rollbackFor:回滚的异常类列表,他的值是一个数组,每个值是异常类的class。
      6、rollbackForClassName:表示回滚的异常类列表,他的值是异常类名称,是String类型的值
      7、noRollbackFor:指定不需要回滚的异常类,是class类型的
      8、noRollBackForClassName:不需要回滚的异常类列表,是String类型的
    • 位置
      1、在业务方法的上面,是在public方法的上面
      2、在类的方法
    • 注解的使用步骤
      1、在spring的配置文件中,声明事务的内容
        A、声明事务管理器,说明使用哪个事务管理器对象
        B、声明使用注解管理事务(开启事务注解驱动)
      2、在类的源代码中,加入@Transactional
      事务的控制模式:
      1、编程式,在代码中编程控制事务
      2、声明式事务,不用编码
      @Transactional 使用的特点:
      1、spring框架自己提供的事务控制
      2、适合中小型项目
      3、使用方便效率高

    5.6 使用AspectJ框架

    使用aspectj的aop,声明食物控制叫做声明式事务
    使用步骤:
    1、在pom文件中加入spring-aspects的依赖
    2、在spring的配置文件中声明事务的内容
    A、声明事务管理器
    B、声明业务方法需要的事务属性
    C、声明切入点表达式
    声明式事务的优缺点
    1、缺点:理解难,配置复杂
    2、优点:代码和事务是分开配置的,控制事务源代码不需要修改
         能快速了解和掌控项目的全部事务,适合大型项目。

    相关文章

      网友评论

          本文标题:第五章 Spring 事务

          本文链接:https://www.haomeiwen.com/subject/xitpcrtx.html