关于事务回滚

@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

 

 

posted @ 2023-08-17 10:55  不是代屿  阅读(30)  评论(0编辑  收藏  举报