Как обрабатывать многопоточные вставки с уникальным ограничением в базе данных, используя JPA/Hibernate?

В бине, управляемом сообщениями, я сохраняю записи в таблице поиска с уникальными записями. По сути, я создаю оператор выбора с критериями API, и если я не нахожу запись, я создаю ее.

В настоящее время этот код работает на ошибки MySQL, потому что в некоторых случаях это создание записи (em.persist(entry)) будет нарушать уникальное ограничение на мою базу данных. другой экземпляр моего mdb создал запись для поиска после того, как я ее не нашел и до того, как смог ее создать.

Как я могу справиться с этой проблемой синхронизации, так что все еще есть только одна запись?

1 ответ

Решение

Вам необходимо использовать SELECT FOR UPDATE или по-разному гарантировать уникальность (например, генерировать уникальную часть записи внутри Java).

Hibernate поддерживает пессимистичные блокировки, которые, как я полагаю, являются еще одним названием для той же вещи.

Другие вопросы по тегам