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

я есть несколько экземпляров приложения J2EE, работающего в одном кластере WebLogic.

В какой-то момент эти приложения выполняют MERGE для вставки или обновления записи в серверной базе данных Oracle. MERGE проверяет, есть ли строка с указанным первичным ключом или нет. Если это там, обновите. Если нет, вставьте.

Теперь предположим, что два экземпляра приложения хотят вставить или обновить строку с первичным ключом = 100. Предположим, что строка не существует. На этапе «проверки» слияния они оба видят, что строк нет, поэтому они оба пытаются вставить. Тогда я получаю уникальное ключевое ограничение нарушения.

У меня такой вопрос: есть ли в Oracle атомное MERGE? Я ищу что-то похожее наINSERT ... FOR UPDATE в PL / SQL, за исключением того, что я могу выполнять SQL только из моих приложений.

РЕДАКТИРОВАТЬ: мне было неясно. Я использую инструкцию MERGE, пока эта ошибка все еще происходит. Дело в том, что только «модифицирующая» часть является атомарной, а не целое слияние.