因此,我有一个多线程的批处理程序,它可以获取一些值并将它们插入到Oracle DB中。我收到的报告显示,这个处理器正在记录下 Unique Constraint
错误。
这是处理器用来插入的查询。
INSERT INTO TABLE_T
(VALUE_A_PK, VALUE_B_PK, VALUE_C, VALUE_D, VALUE_E, VALUE_F, VALUE_G, VALUE_H, VALUE_I, VALUE_J)
SELECT ?,?,?,?,?,?,?,?,?,? FROM DUAL
WHERE NOT EXISTS
(SELECT 1 FROM TABLE_T WHERE
VALUE_A_PK= ? AND VALUE_B_PK = ?);
我知道有很多方法可以解决这个问题 但首先我需要重新创建错误来证明我确实解决了这个问题 尽管我给处理器输入了多条重复的记录 但我无法手动让错误重新出现
在我看来,几乎可以肯定这是一个多线程问题,即多个线程试图同时插入一条新记录。
有没有一种可靠的方法可以强制多个线程同时执行?如果我能做到这一点,那么似乎我应该能够让错误重新弹出。
没有办法在两个会话中同时启动两个语句。确切 同一时间。像DBMS_SCHEDULER这样的工具或许可以在一秒钟内可靠地启动两个进程,但要模仿单行插入的主键错误,你需要更高的精度。
在两个单独的会话中循环运行该语句可能更容易,只需等待其中一个失败即可。我以前曾多次这样做来重现间歇性问题。
在两个或两个以上的会话中运行这个伪代码,然后等待错误。
begin
for i in 1 .. 1000000 loop
INSERT INTO TABLE_T ...
end loop;
end;
/