Именно поэтому большинство людей используют SEQUENCE
для создания уникальных чисел. Тем не менее, вы должны заблокировать всю таблицу (LOCK TABLES
). Проблема: Вы должны заблокировать все нужные вам таблицы (т. Е. Все, что может коснуться Hibernate), иначе вы получите ошибки. Затем необходимо разблокировать таблицы и выполнить обе эти операции синхронно с остальной частью транзакции.
Надеюсь, это дает вам представление о том, почему люди используют последовательности: у них есть небольшие недостатки, такие как пробелы, но все остальное гораздо хуже.
[РЕДАКТИРОВАТЬ] Вы можете определить последовательность, а затем использовать собственный запрос SQL для получения следующего значения. Вы можете попытаться определить генератор последовательности (см. документы ), но, возможно, сопоставление разрешено только для полей Id.
Re "200 миллионов имен": пока база данных может хранить число, вы также можете определить последовательность по нему.
Re "блокировка на основе строк": какую строку вы планируете заблокировать? Тот, с максимальным значением? Я не уверен, что оператор max()
остановится, если вы заблокируете его. То, что вы можете попробовать, это триггер . Поскольку триггеры являются атомарными, никто не может вставить строку во время ее работы. Но триггер немного сложен в обслуживании.