编程式事务
// 事务管理器【管理事务的,使用这个来开启事务】
@Autowired
private DataSourceTransactionManager dataSourceTransactionManager;
// 事务属性【在事务管理器获取事务的时候需要进行传递】
@Autowired
private TransactionDefinition transactionDefinition;
// 开启事务
TransactionStatus transactionStatus = dataSourceTransactionManager
.getTransaction(transactionDefinition);
// 提交事务
dataSourceTransactionManager.commit(transactionStatus);
// 回滚事务
dataSourceTransactionManager.rollback(transactionStatus);
声明式事务【注解】
就是一个 SpringAOP 的环绕通知,代码块执行时开启事务,结束时提交事务,发生异常回滚事务
如果程序中的异常被手动捕获了,就不会触发回滚:如果还是需要回滚,就需要在 catch 中进行手动回滚:
- 抛出异常
- 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 参数
- value:该注解针对的是方法中的哪个事务【存在多个事务的时候 - 事务管理器】
- propagation:传播机制【在方法调用过程中,另外一个存在事务的方法报错了,自己的方法该如何处理】
- isolation:隔离级别【默认使用的是连接数据库的隔离级别,也可以手动设置】
- timeout:事务执行的超时时间,超时后就自动回滚
- readOnly:只读事务【在事务中,多条语句的读取的一致性,不使用普通事务,也是为了效率】
传播机制
嵌套事务和加入事务的区别:加入事务是两个事务一荣俱荣;嵌套事务:后序事务出问题,不会影响前面的事务【使用保存点实现】
- Propagation.REQUIRED:默认的事务隔离级别,如果调用方存在事务,则直接用同一个事务;若调用方没有事务,则创建一个新事务
- Propagation.SUPPORTS:如果调用方存在事务,则直接用同一个事务;若调用方没有事务,自己的事务机制也不生效
- Propagation.MANDATORY:如果调用方存在事务,则直接用同一个事务;如果没有直接报错
- Propagation。REQUIRES_NEW:如果调用方存在事务,则挂起,自己新创建一个事务
- Propagation.NOT_SUPPORTED:不管有没有事务,都要以非事务的方式运行
- Propagation.NEVER:如果调用方存在事务,则直接抛异常
- Propagation.NESTED:如果有事务则嵌套,没有则创建新事务