Spring 事务管理相关知识

作者: 右耳菌 | 来源:发表于2022-04-15 01:01 被阅读0次

    一、事务管理

    1. 几种事务
    • JDBC事务
      try {
          connection.setAutoCommit(false); // 开启事务
          /*
           *  TODO  do work
          */
          connection.commit(); // 提交事务
      } catch(Exception e) {
          connection.rollback(); // 发生异常,回滚
      } finally {
          connection.close(); // 关闭连接
      }
    
    • Hibernate事务
      Session session = factory.openSession(); // 获取Session
      Transaction tx = null;
      try {
          tx = session.beginTransaction(); // 开启事务
          /*
           *  TODO  do work
           */
          tx.commit(); // 提交事务
      } catch (Exception e) {
          if(tx != null) {
              tx.rollback(); //发生异常,回滚
          }
      } finally {
          session.close(); // 关闭连接
      }
    
    2. Spring 事务管理
    • 产生的原因和一些概念

      • 可以看到各种类型的事务,其实现的代码并不一致,对于不同的框架有不同的数据库事务的实现方式。而Spring事务管理可以解决这个问题。
      • 统一的事务编程模型。
      • 编程式事务和声明式事务(AOP)
    • PlatformTransactionManager

      • 有以下三个重要方法接口
        1. TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;
        2. void commit(TransactionStatus status) throws TransactionException;
        3. void rollback(TransactionStatus status) throws TransactionException;
      • 点击查看官方API文档
      • 实现
        • DataSourceTransactionManager - (JDBC的实现)
        • HibernateTransactionManager - (Hibernate的实现)
    PlatformTransactionManager 的实现
    • TransactionDefinition

      • getName:事务名称
      • getIsolationLevel:隔离级别
      • getPropagationBehavior:传播行为
      • getTimeout:超时时间
      • isReadOnly:是否是只读事务
      • 点击查看官方API文档
    • TransactionStatus

      • isNewTransaction:是否是新的事务
      • hasSavepoint:是否有savepoint(诊断,NESTED)
      • isCompleted:是否已经完成
      • isRollbackOnly:事务结果是否是rollback-only
      • setRollbackOnly:设置事务为rollback-only(TransactionTemplate)
      • 点击查看官方API文档
    3. 事务的隔离级别
    • ISOLATION_READ_UNCOMMITTED : 读未提交
    • ISOLATION_READ_COMMITTED∶读提交
    • ISOLATION_REPEATABLE_READ : 重复读
    • ISOLATION_SERIALIZABLE : 串行化
    • ISOLATION_DEFAULT : 默认
    4. 传播行为

    假设有一个情况:事务B调用了事务A,如下图所示:

    事务B调用了事务A
    事务关系

    简单的

    • PROPAGATION_MANDATORY - 必须在一个事务中运行,不存在则抛异常
    • PROPAGATION_NEVER - 不应该在事务中运行,存在则抛异常
    • PROPAGATION_NOT_SUPPORTED - 不应该在事务中运行,存在则挂起
    • PROPAGATION_SUPPORTS - 不需要事务,有则在事务中执行

    复杂的
    需要参考以下内容
    -

    PROPAGATION_REQUIRED | PROPAGATION_NESTED
    • PROPAGATION_REQUIRED
    • 必须在事务中执行,如果不存在,则启动新事务
    • 内部事务会影响外部事务
    • PROPAGATION_NESTED
    • 必须在事务中执行,如果不存在,则启动新事务
    • 事务之间互相不影响

    PROPAGATION_REQUIRES_NEW
    • PROPAGATION REQUIRES_NEW
    • 必须在新事务中执行,挂起当前事务
    • 独立physical事务

    相关文章

      网友评论

        本文标题:Spring 事务管理相关知识

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