Преднамеренное воссоздание многопоточности SQL ошибки - PullRequest
1 голос
/ 30 мая 2020

Итак, у меня есть пакетный процессор, который является многопоточным, который принимает некоторые значения и вставляет их в Oracle БД. Я получаю сообщения о том, что этот процессор регистрирует 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 = ?);

Я знаю способы исправить это, но сначала мне нужно воссоздать ошибку, чтобы доказать, что я действительно ее исправил. Несмотря на подачу нескольких повторяющихся записей в процессор, я не могу вручную восстановить ошибку.

Мне почти наверняка кажется, что это проблема многопоточности, когда несколько потоков пытаются вставить новую запись одновременно .

Есть ли надежный способ заставить более одного потока выполняться в одно и то же время? Если бы я мог это сделать, то, похоже, я смог бы восстановить всплывающее окно с ошибкой.

1 Ответ

0 голосов
/ 03 июня 2020

Невозможно запустить два оператора в двух сеансах в точное время. Такие инструменты, как DBMS_SCHEDULER, возможно, могли бы надежно запустить два процесса в течение секунды, но для имитации ошибок первичного ключа при вставке одной строки вам потребуется гораздо более высокая точность. сеансов в al oop и просто подождите, пока один из них не выйдет из строя. Я делал это несколько раз раньше, чтобы воспроизвести периодически возникающие проблемы.

Запустите этот псевдокод в двух или более сеансах и дождитесь ошибки:

begin
    for i in 1 .. 1000000 loop
        INSERT INTO TABLE_T ...
    end loop;
end;
/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...