有意重新创建一个多线程SQL错误。

问题描述 投票:1回答:1

因此,我有一个多线程的批处理程序,它可以获取一些值并将它们插入到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 = ?);

我知道有很多方法可以解决这个问题 但首先我需要重新创建错误来证明我确实解决了这个问题 尽管我给处理器输入了多条重复的记录 但我无法手动让错误重新出现

在我看来,几乎可以肯定这是一个多线程问题,即多个线程试图同时插入一条新记录。

有没有一种可靠的方法可以强制多个线程同时执行?如果我能做到这一点,那么似乎我应该能够让错误重新弹出。

java sql multithreading oracle
1个回答
0
投票

没有办法在两个会话中同时启动两个语句。确切 同一时间。像DBMS_SCHEDULER这样的工具或许可以在一秒钟内可靠地启动两个进程,但要模仿单行插入的主键错误,你需要更高的精度。

在两个单独的会话中循环运行该语句可能更容易,只需等待其中一个失败即可。我以前曾多次这样做来重现间歇性问题。

在两个或两个以上的会话中运行这个伪代码,然后等待错误。

begin
    for i in 1 .. 1000000 loop
        INSERT INTO TABLE_T ...
    end loop;
end;
/
© www.soinside.com 2019 - 2024. All rights reserved.