问题形容
有一天,测试妹子 W 向我提了一个 BUG,问题形容如下,当操作动作 D 时,动作 D 能够看作更新,更新我以后抉择的那一条数据,妹子 W 看到操作 D 胜利页面中多出一条一样的数据,冀望的后果是只会更新以后抉择行的数据,并不会新增多余的数据。
问题起因
开始的时候,我认为代码有问题,查看一下代码,应该没有太大的问题,一般操作动作 D 时,数据会更新,不会新增多余的数据,然而在出现异常时,这个问题,就会复现进去,我以后猜测应该有事务有关系。
当初我先阐明一下,动作 D 的业务逻辑,当咱们点击动作 D 时,首先会调用更新操作,更新数据,此处的更新为先删除原先的数据,后从新插入数据,更新完结后,持续向下执行其它逻辑。在我 Debug 的时候,发现在删除的逻辑上事务有回滚,惟一的是插入数据竟没有回滚,我认为是 Mybatis plus 有什么非凡的骚操作, 原谅过后无知的我,我在 Google 上找了好多文章就是没找到这个问题产生的起因。最初,只能把这个 BUG 先放一边,忙着修复其它 Bug。
当我把所有的事件都忙完了,我又从新看了动作 D 的逻辑,看到插入的逻辑,这个插入数据的逻辑我是间接调用共事写好的办法,我看到产生 BUG 的起因,因为插入的数据有可能有许多,那段的逻辑应用了多线程插入数据。多线程影响事务回滚,事务没方法回滚多线程的数据。
解决步骤
发现问题后,当然要解决问题,多线程影响事务回滚,那我就用最笨的办法,从新写一段插入数据的逻辑,解决这个事务问题。写完代码本地测试,当出现异常时,删除操作回滚数据,新增操作回滚数据,解决完问题,发到测试环境让妹子 W 再测试一遍,美滋滋!
总结
这个问题,节约了我许多工夫,上网找材料,还有掉头发,最初才发现问题的起因,事实阐明我平时粗枝大叶,没有看清楚代码的逻辑,遇到问题首先不是看代码,而是上网找解决办法。这个坏习惯影响着我,当前的工作中应该防止这类事件的呈现。还有一个问题,就是应用他人的代码肯定要看两头的逻辑,他人应用没有问题,并不代表你应用那局部代码也没有问题,所以工作中要认真。