关于for循环插入数据,遇到重复的,手动回滚之前插入的数据

这种方式我懂,但是我的困惑点是:是不是这里捕捉到异常了,@Transactional自动就帮助我们进行回滚了。然后只要全局处理抛出的异常就可以了,比如把异常信息返回给前台这样子。

嗯,对。你可以看看整个日志流程。你可以清楚的看到。什么时候开启的事务,什么时候提交/回滚。

那老哥我再问一句:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();这句话该怎么使用。我在使用这句话之后,再怎么给到前台相应的信息?

我没用过这个。你用它的目的是什么呀?

也是一种类似于手动回滚的方式。我的目的很简单:①判断到重复的信息—>②先手动回滚–>③然后return 给前台信息。但是,我的代码到了②处之后就会出现异常。然后你写的方式就是直接是①—>③,中间的②交给了@Transactional去处理。既然@Transactional能处理,那么我到底应该怎么像@Transactional一样去处理这个回滚机制。

没手动去回滚过spring的事务。

@Transactional注解指定自定义那个异常,然后手动抛出异常,带上单号。全局捕获自定义异常,推送给前端就好了

Spring 事务保存点savepoint 可以了解一下啊

1 个赞

用 Exception不是很妥吧,我记得好像这样写还会提示你进行捕获得把
image
这里提示有一个为处理的异常,需要自行捕获
直接 throw new RuntimeException(“异常”); 不香嘛
image

我自己一直遇到这种需要自己抛出异常的一般都是 用运行是一场给放出去让他进行回滚的

老哥,我觉得可先这样做,用 货架号(location)统一去查询(所有的location封装到数组或者集合)是否相同的 货架号(location),如果其中有一条相同,就不执行insert,直接返回信息给客户端说,某条记录存在。反则没有就执行insert。findByLocation方法改为for去查询,你看如何,就没必要去使用事物那么麻烦。

后台报什么错

通过事务控制可以有两种办法,第一种就是加@Transactional注解,你再定义一个重复插入的异常,这样spring会自动帮你回滚,第二种就是编程式事务,需要注入 PlatformTransactionManager和TransactionDefinition, 你自己来控制回滚和提交