关于事务回滚
@transcational注解能用在任何spring boot 项目的组件的方法里 也就是被@component 修饰的类
常见的service类的@service注解内部就有@component注解,所以可以直接使用@transcational注解进行回滚
微服务就是@globaltranscational 具体使用可能要配合异步线程或者一些异步消息时处理,使用的也是阿里seata模式中的AT 比较简单方便理解
还有一种方式就是当代码中不允许抛出异常,异常被try catch
就可以使用下面的方式手动回滚
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); (ps:这种方式无法回滚包装方法内的事务,且当该方法放在try catch中时如果异常发生在数据库事务前,他也会抛出“没有事务”这个异常,谨慎处理)
ps:@transcational在进行回滚时,只能对dml语句进行回滚也就是 对表数据的增删改查 ,对于一些ddl语句 这种直接操作表的事务是没办法回滚的 一般的数据库都会自动提交ddl语句的事务 导致一些事务回滚的失效,
pppps:在gpt搜了一个可以回滚的方法
但是说是及其影响效率 不推荐 我也没试过
**************************************************************************************************************************************
关于保存点回滚
//创建事务保存点
Object savePoint = TransactionAspectSupport.currentTransactionStatus().createSavepoint();
//回滚至事务保存点
TransactionAspectSupport.currentTransactionStatus().rollbackToSavepoint(savePoint);
//释放事务保存点
TransactionAspectSupport.currentTransactionStatus().releaseSavepoint(savePoint);
这种方式的回滚可以回滚包装方法内的事务
但是他必须要配置事务管理器 开启@EnableTransactionManagement