Spring事务及其传播机制

135 阅读2分钟

编程式事务

// 事务管理器【管理事务的,使用这个来开启事务】
@Autowired
private DataSourceTransactionManager dataSourceTransactionManager;

// 事务属性【在事务管理器获取事务的时候需要进行传递】
@Autowired
private TransactionDefinition transactionDefinition;

// 开启事务
TransactionStatus transactionStatus = dataSourceTransactionManager
        .getTransaction(transactionDefinition);

// 提交事务
dataSourceTransactionManager.commit(transactionStatus);

// 回滚事务
dataSourceTransactionManager.rollback(transactionStatus);

声明式事务【注解】

就是一个 SpringAOP 的环绕通知,代码块执行时开启事务,结束时提交事务,发生异常回滚事务

如果程序中的异常被手动捕获了,就不会触发回滚:如果还是需要回滚,就需要在 catch 中进行手动回滚:

  1. 抛出异常
  2. tansactionAspectSupport.currentTransactionStatus().setRollbackOnly();
@RequestMapping("/add1")
@Transactional
public int add1(String name) {
    if(!StringUtils.hasLength(name)) {
        return 0;
    }
    int result = userService.add(name);
    return result;
}

@Transactional 参数

  1. value:该注解针对的是方法中的哪个事务【存在多个事务的时候 - 事务管理器】
  2. propagation:传播机制【在方法调用过程中,另外一个存在事务的方法报错了,自己的方法该如何处理】
  3. isolation:隔离级别【默认使用的是连接数据库的隔离级别,也可以手动设置】
  4. timeout:事务执行的超时时间,超时后就自动回滚
  5. readOnly:只读事务【在事务中,多条语句的读取的一致性,不使用普通事务,也是为了效率】

传播机制

嵌套事务和加入事务的区别:加入事务是两个事务一荣俱荣;嵌套事务:后序事务出问题,不会影响前面的事务【使用保存点实现】

  1. Propagation.REQUIRED:默认的事务隔离级别,如果调用方存在事务,则直接用同一个事务;若调用方没有事务,则创建一个新事务
  2. Propagation.SUPPORTS:如果调用方存在事务,则直接用同一个事务;若调用方没有事务,自己的事务机制也不生效
  3. Propagation.MANDATORY:如果调用方存在事务,则直接用同一个事务;如果没有直接报错
  4. Propagation。REQUIRES_NEW:如果调用方存在事务,则挂起,自己新创建一个事务
  5. Propagation.NOT_SUPPORTED:不管有没有事务,都要以非事务的方式运行
  6. Propagation.NEVER:如果调用方存在事务,则直接抛异常
  7. Propagation.NESTED:如果有事务则嵌套,没有则创建新事务

image.png