У меня есть Perl-скрипт, который запускается параллельно.
ls -lrt INCOMING | grep .out | head -${PARALLEL_COUNT} | awk '{print $9}' | parallel "./new_control.pl" {}
Сценарий, обрабатывающий файлы CSV, которые отправляют данные сервера.
Когда скрипт работает параллельно, у меня есть исключение
Uncaught exception from user code:
DBD::Oracle::st execute failed: ORA-00001: unique constraint (PRE.SYS_C006373) violated (DBD ERROR: OCIStmtExecute) [for Statement "INSERT INTO DISK
(
ID,
RECORD_ID,
MOUNT_POINT,
TOTAL_SIZE,
USED,
AVALIABLE,
CAPACITY,
)
VALUES ((SELECT NVL(MAX(ID)+1, 1) FROM DISK), ?, ?, ?, ?, ?, ?, ?, ?, ?)
Полагаю, проблема в столбце идентификатора, в который вставляется увеличенное значение.
(SELECT NVL(MAX(ID)+1, 1)
и тот же идентификатор уже вставляется другим экземпляром скрипта.
Я пытался изменить AutoCommit, но без какого-либо положительного результата
our $dbh = DBI->connect("dbi:Oracle:host=$host;sid=$sid;port=$port", $username, $password,
{
RaiseError => 1,
AutoCommit => 1 # this will need to call commit manually (if value is 0) after changes in DB.
});
Когда скрипт не запускается параллельно, все в порядке. Я не хочу генерировать эти идентификаторы до того, как параллельно запусту скрипт.