1、@Transactional注解:
- @Transactional注解只能感知RunTimeException,对于其它异常不能进行回滚
- @Transactional(rollbackfor = Exception.class)注解可以感知所有Exception异常,都能进行回滚
- @DSTransactional,多数据源事务注解,不需要参数
2、@Transactional注解方法内嵌套try-catch:
- 方法中进行try-catch捕获了异常并在catch中处理,不将异常抛出,@Transactional无法进行异常感知,无法进行回滚
- 方法中进行try-catch捕获了异常并将异常抛出,@Transactional可以感知异常并进行回滚
- 方法中进行try-catch捕获异常后,若想进行处理并回滚事务,可以在catch内使用编程式事务进行手动回滚,回滚后catch内的代码会继续执行
- 若在catch中进行了相关代码处理,并在处理结束后自定义一个异常抛出,@Transactional可以感知到异常并回滚,同时,catch中相关的处理操作也会被回滚
3、编程式事务的用法:
事务的前提是使用Spring框架,需要导入相关dependency依赖。编程式事务是为了使用更细粒度的事务对方法进行约束
以下是编程式事务的基本用法,详细用法还请参考文档或阅读源码!!!
-
PlatformTransactionManager
// 注入事务管理对象
@Autowired
private PlatformTransactionManager transactionManager;
// 获取事务接口,TransactionStatus继承了SavepointManager接口,SavepointManager是对事务中保存状态点功能的封装
TransactionStatus status = null;
// 手动开启事务,TransactionDefinition:事务定义,包括事务的隔离级别,事务的传播属性,超时时间设置等
status = transactionManager.getTransaction(new DefaultTransactionDefinition());
// 事务提交
transactionManager.commit(status);
// 事务回滚
if (判断条件) {
transactionManager.rollback(status);
}
-
TransactionTemplate(核心方法为execute)
@Autowired
private TransactionTemplate transactionTemplate;
// 使用spring提供的事务模板对象的函数式接口,可传参数,具体参数见方法
transactionTemplate.execute(()->{
// 操作内容1
// 操作内容2
});