Spring 事务管理相关知识

一、事务管理

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 事务管理相关知识)