Transaction

Spring 事务的本质是数据库对事务的支持。

@EnableTransactionManagement 开启对事务注解的解析

1 声明式事务

1.1 @Transactional 注解

属性 类型 描述
value String 事务管理器
propagation Propagation 传播级别
isolation Isolation 隔离级别
readOnly boolean 读/写与只读事务
timeout int 事务超时(秒)
rollbackFor Class 触发事务回滚的类,默认只对未检查异常有效
noRollbackFor Class 设置不需要进行回滚的异常类数组

1.2 Transactional 特性

  • 类上添加 @Transactional,在每个方法单开一个事务,管理方式相同。
  • @Transactional 注解只在 public 方法上起作用。
  • 默认只对未检查异常回滚
  • 只读事务只在事务启动时应用,否则即使配置也会被忽略。

1.3 传播级别

  • PROPAGATION_REQUIRED
    (默认设置)存在则加入,没有则创建
  • PROPAGATION_REQUIRES_NEW
    创建新事务,如当前事务存在,则挂起当前事务
  • PROPAGATION_SUPPORTS
    存在则加入;没有则以非事务的方式运行
  • PROPAGATION_NOT_SUPPORTED
    以非事务方式运行,如果当前存在事务,则把当前事务挂起。
  • PROPAGATION_MANDATORY
    如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
  • PROPAGATION_NEVER
    以非事务方式运行,如果当前存在事务,则抛出异常
  • PROPAGATION_NESTED
    存在则创建嵌套事务;没有则创建

1.4 隔离级别

  • ISOLATION_DEFAULT
    (默认设置)使用底层数据库的默认隔离级别。
  • ISOLATION_READ_UNCOMMITTED
    可读取修改还没有提交的数据
  • ISOLATION_READ_COMMITTED
    只能读取已经提交的数据。推荐。
  • ISOLATION_REPEATABLE_READ
    可重复读,每次返回相同。
  • ISOLATION_SERIALIZABLE
    逐个执行事务,性能低。

2 编程式事务

2.1 TransactionTemplate

在 doIntransaction 里处理逻辑。如果出异常了,就执行 isRollbackOnly 方法进行回滚。

@Autowired
TransactionTemplate transactionTemplate;

transactionTemplate.execute((TransactionStatus transactionStatus) -> {
try {
//...
} catch (Exception e) {
transactionStatus.isRollbackOnly();
throw e;
}
return null;
});

2.2 TransactionManager

手动 commit,异常就 rollback

TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition());
try {
userRepository.save(user);
transactionManager.commit(status);
} catch (Exception e) {
transactionManager.rollback(status);
e.printStackTrace();
}
Author: iMine
Link: https://imine141.github.io/2020/07/20/Spring/Data/Transaction/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.