每一年都奔走在自己热爱里

没有人是一座孤岛,总有谁爱着你

Spring学习笔记(六)-事务概念

Spring学习笔记(六)-事务概念

事务
  • 一些作为整体的sql语句,不可分割,同时成功或失败

  • mysql执行事务
    beginTransaction	开启事务
    select * from student where Xxx
    updata school set Xxx=Xxx
    endTransaction	事务结束
    
  • 保持数据的一致性

  • 在业务层进行事务支持

事务管理器
  • 不同的数据库访问技术有不同的事务处理

  • mysql中的事务控制

    • public void updataAccount(){
         try{
              Connection coo = ...
              coo.setAutoCommit(false);
              ... ...
              coo.commit;
              coo.setAutoCommit(true);
         }catch(Exception e){
              conn.rollback();
         }finally{
              //释放资源...
         }    
      }
      
  • Mybatis事务的处理

    •   public void updataAccount(){
           try{
                SqlSession session = SqlSessionFactory.openSession(false);
                ... ...
                session.commit;
           }catch(Exception e){
                session.rollback();
           }finally{
                //释放资源...
           }    
        }
      
  • Spring统一管理事务,将不同的数据库访问技术的事务处理统一起来,开发只需掌握Spring的事务处理方案就可以实现不同的数据库访问技术,Spring使用事务管理器处理

Spring事务管理器
  • Spring事务管理器,用于事务管理的接口对象
  • 事务管理器是PlatformTransactionManager接口对象,主要用于完成事务的提交、回滚、及获取事务的状态信息
  • 事务管理器有多种实现类,不同的数据库访问技术有不同的实现类,由具体的实现类完成事物的控制
  • JDBC和Mybatis的事务管理器实现类:DataSourceTransactionManager
  • Hibernate框架的事务管理器实现类:HibernateTransactionManager
Spring事务管理使用环绕通知
  • 环绕通知:可以增强目标方法而不需要修改目标代码

  • @Around(value="execution(* *..add*(..))")
    public Object myAround(ProceedingJoinPoint pjp){
        try{
            PlatformTransactionManager.beginTransaction();
            pjp.procced();
            PlatformTransactionManager.commit();
        }catch(Exception e){
            PlatformTransactionManager.rollback();
        }finally{
            //释放资源
        }
    }
    
事务定义接口TransactionDefinition
  • 定义了有关事务控制的属性

    • 隔离级别
    • 传播行为
    • 事务超时
  • 给业务方法说明事务属性与ACID不同

  • 隔离级别:

    • 控制事务之间互相影响的程度:
      • DEFAULT:Mysql中默认使用可重复读,Oracle默认为读并提交
      • READ_UNCOMMITTED:读未提交,未解决任何并发问题,可读取到其他事务未提交的数据,存在脏读问题,在其他事务回滚后存在数据错误
      • READ_COMMITTED:读已提交,解决脏读问题,存在不可重复读与幻读,其他事务提交之后才能读取到其他事务提交到的数据,存在不可以重复读问题,在其他事务提交的前后读取到的数据存在不一致的可能性
      • REPEATABLE_READ:可重复读,解决脏读、不可重复读,存在幻读,本事务开启后其他事务不再被允许进行修改操作,然而其他事务可以进行INSERT增删操作,导致数据记录在本次事务间突然发现变化为幻读
      • SERIALIZABLE:串行化,不存在并发问题
  • 事务超时

    • 默认为-1,表示“无上限”
    • 以秒为单位,表示一个业务方法最长的执行时间,达到时间没有执行完成,Spring进行回滚操作
  • 传播行为

    • 业务方法在调用时,事务在方法之间的传递和使用,使用传播行为能够标识方法有无事务
    • REQUIRED:
      • Spring默认的传播行为,方法在调用的时候存在事务则使用当前事务,如果没有事务则新建事务,方法在新事务中执行
      • 如该传播行为加在 doOther()方法上。若 doSome()方法在调用 doOther()方法时就是在事务内运行的,则 doOther()方法的执行也加入到该事务内执行。若 doSome()方法在调用doOther()方法时没有在事务内执行,则 doOther()方法会创建一个事务,并在其中执行。
    • PROPAGATION_SUPPORTS:
      • 有则加入当前事务,无则也不自加
    • PROPAGATION_REQUIRES_NEW:
      • 总是新建一个事务,如果当前存在事务则挂起当前事务,直到新事务执行完毕
posted @ 2020-12-11 18:22  雨下整夜~  阅读(101)  评论(0)    收藏  举报