Как избежать нарушения уникальных ограничений с помощью спящего режима? - PullRequest
2 голосов
/ 26 января 2011

У меня есть таблица базы данных, которая имеет уникальное ограничение, определенное для одного из ее столбцов.У меня также есть система обработки сообщений с несколькими потоками.Поскольку сообщения используются, могут быть случаи, когда два сообщения содержат один и тот же объект с одинаковым значением (значением столбца, для которого определено уникальное ограничение).Таким образом, в коде сервисный уровень сначала запрашивает базу данных, используя это уникальное поле (через именованный запрос гибернации), чтобы проверить, существуют ли какие-либо записи первыми.Если нет, то он вставляет новую запись.Если запись с этим уникальным полем уже существует, вместо вставки записи она обновляет ее, а также вставляет дочернюю запись в другую таблицу.

Я сталкиваюсь с проблемой, при которой второй поток считает, что записьеще не существует, поэтому он пытается вставить его. Однако к этому времени первый поток уже успешно вставил запись.Таким образом, исключение возникает из-за нарушения уникального ограничения.Можете ли вы помочь, как лучше всего справиться с подобной ситуацией, используя решение hibernate / oracle?Нужны ли какие-то варианты блокировки?Спасибо.

1 Ответ

1 голос
/ 26 января 2011

Попытка избежать отката в этом случае идет вразрез с духом MVCC (в частности, используется Oracle), поскольку он требует чрезмерной блокировки.реагировать на откат вставки, запуская другую транзакцию для выполнения обновления.

...