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();
}