为Oracle数据表的时间列建立Unique index后发生的

时间:2021-07-15 10:28:09


    在为oracle数据做优化的过程中,遇到了一个很奇异的现象,也是自己的一个不留神吧,在为其中一个表的一个时间字段添加索引的时候,误将该字段的聚集索引定义成了一个unique,大家都知道,就算是聚集索引,其内容也是允许重复的,但是如果添加了unique的话,就不能允许任何相同值的存在了。


    继续描述,然后在执行系统的一个批量操作的时候出现了比较怪异的问题,我们的系统可以允许同时发送多份公文条目,但是,经过测试发现,会出现随机的发送失败,而且很难找出问题发生地规律,于是,我开始跟踪代码,查看问题的所在,当自己把一些关键部分添加完断点之后,一步一步的调试情况下,问题居然无法重现!?


    但是一旦去掉断点,问题就会重现,经过异常抛出的线索,在不能单步调试的情况下,发现居然是在执行插入操作的时候发生地异常,提示错误大致意思为:插入的数据违反了表中的索引XXX的唯一约束,仔细一看,原来为了查询的方便而为创建时间列createtime添加的索引居然包含unique的约束条件!


    这一下,一切都明白了,之所以问题发生没有固定规律,以及在单步调试下不会重现的原因。但同时也发现一个问题,即对于oracle来讲,我们循环执行的数据库事务,有可能不是按照我们循环的次序进行执行的,数据库可能会对这种类似批量的事务进行优化处理,这也是导致问题不一致的一点原因吧。