最近上线了个新功能,把3个表的数据转到另外3个表里。大概是这样:
1、清空A1、B1、C1表
2、将A2、B2、C2表的数据放到A1、B1、C1中(对应表的表结构完全一致)
3、清空A2、B2、C2表
1、3中用的truncate,2用的insert select from
测试时没问题,上线后发现有问题,有时候1表和2表都没数据,有时候1表有了2套数据。总之没见到正常的时候。
程序log正常、oracle的log(v$sql)也正常。
但是在看oracle的log时,发现了一点蛛丝马迹,就是truncate执行时,oracle会lock相应的表。
所以猜测是不是因为锁和insert发生了什么冲突导致的问题。
下一步打算把truncate换成delete,但因为投产流程比较长而且这个bug不影响目前的功能,所以等有结果后再来更新。
==========================================================
终于更新了。但是结果还是让人很晕。
truncate换成delete后,原来的问题还是没有解决。忽然想起我们的服务器是负载均衡的,然后去和运营的同事确认了一下,被告知由于我的功能是定时任务,加载到服务器里的,所以执行时,每台服务器都会跑一次,又由于我的功能是即有删除也有生成。加载时肯定会有毫秒级的先后,所以导致了结果的不确定。