1、使用声明式事务 @Transactional
注意,@Transactional 只回滚RuntimeException和Error,而Exception、IOException是不会回滚的。
所以为了所有异常都能正常回滚,一般会写为:@Transactional(rollbackFor = Exception.class)
2、使用编程式事务
(1)PlatformTransactionManager
@Resource
private PlatformTransactionManager transactionManager;
TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionAttribute());
transactionManager.rollback(status); // 手动回滚
transactionManager.commit(status); // 提交事务
// 也可创建回滚点,回滚部分内容
Object savepoint = TransactionAspectSupport.currentTransactionStatus().createSavepoint();
TransactionAspectSupport.currentTransactionStatus().rollbackToSavepoint(savepoint);
(2)TransactionTemplate
@Resource
private TransactionTemplate transactionTemplate;transactionTemplate.execute(status1 -> {Object savepoint1 = status1.createSavepoint();status1.rollbackToSavepoint(savepoint1);status1.setRollbackOnly();return null;
});
(3)TransactionAspectSupport
注意,使用TransactionAspectSupport要加入注解@Transactional,不然TransactionAspectSupport.currentTransactionStatus()会扔出报错"No transaction aspect-managed TransactionStatus in scope"
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
// 也可创建回滚点,回滚部分内容
Object savepoint = TransactionAspectSupport.currentTransactionStatus().createSavepoint();
TransactionAspectSupport.currentTransactionStatus().rollbackToSavepoint(savepoint);