Предотвращение дублирования вставок без использования уникальных ключей в Oracle - PullRequest
1 голос
/ 09 ноября 2011

Это пример использования при регистрации пользователей через веб-приложение / веб-сервис. У нас есть сложный алгоритм проверки дубликата участника путем просмотра нескольких таблиц, таких как телефон, адрес и т. Д. Алгоритм варьируется в зависимости от страны участника. Таким образом, это ограничение не может быть реализовано с использованием ограничения первичного ключа / уникального ключа.

Итак, у нас есть проверки в коде Java. Но если есть 2 дублирующих одновременных запроса, 2 потока Java видят, что элемент не существует, и они оба вставляют запись, что приводит к дублированию. Как я могу предотвратить такие дубликаты вставок?

Я могу предотвратить обновления, используя блокировки на уровне строк или оптимистичный параллелизм Hibernate. Я могу думать о блокировках на уровне таблицы, чтобы предотвратить такие вставки, но ограничивает производительность приложения, так как он также блокирует обновления. Я думаю, что другой вариант - создать таблицу блокировок с записью с id = 'memberInsert' и заставить все вставки через JDBC получить блокировку на уровне строк для этой записи.

Спасибо Suneel

Ответы [ 2 ]

3 голосов
/ 09 ноября 2011

Если оно будет где-то, я ожидаю, что оно будет в триггере записи, а не в коде Java. Некоторое другое приложение или какая-то другая область приложения может что-то делать плохо.

Выгрузка этого в базу данных дает вам два преимущества. 1) Он предотвращает состояние гонки, о котором вы упомянули, и 2) Он защищает целостность данных, не позволяя некоторым ошибочным приложениям изменять записи, переводя их в недопустимое состояние.

1 голос
/ 09 ноября 2011

Разве вы не можете хэшировать результаты алгоритма или чего-то еще и просто использовать его как уникальный первичный ключ?

Пока база данных не знает о ваших требованиях, она вам не поможет.И тогда у вас, вероятно, нет другого выбора, кроме блокировки на уровне таблицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...