Нет, нет проблем одновременного чтения и блокировки таблицы.
Преимущество использования функции псевдокнопки, встроенной в каждую СУБД, состоит в том, что механизм СУБД обрабатывает распределение значений идентификатора атомарно, поэтому одновременные клиенты не будут выделять одно и то же значение идентификатора. Требуется только краткая блокировка внутреннего счетчика идентификаторов, а не вся таблица.
То, что лучше, не имеет значения. Вы должны использовать функцию, предоставляемую СУБД, которую вы используете. К сожалению, псевдокейки не были определены в стандарте ANSI SQL до SQL: 2003. К тому времени каждый поставщик создал собственную проприетарную функцию и синтаксис.
- Oracle использует
SEQUENCE
объекты, которые похожи на Firebird GENERATOR
или SEQUENCE
объекты.
- Microsoft SQL Server использует
IDENTITY
в качестве параметра столбца.
- IBM DB2 и PostgreSQL поддерживают последовательности, но у них также есть некоторая декларативная магия, позволяющая столбцам неявно принимать значения из последовательностей.
- MySQL использует параметр столбца
AUTO_INCREMENT
, а также поддерживает псевдо-тип данных SERIAL
, чтобы обеспечить некоторую перекрестную совместимость с PostgreSQL.
- SQLite предполагает, что любой целочисленный столбец первичного ключа является автоинкрементным.
Если H2 поддерживает как IDENTITY
, так и AUTO_INCREMENT
, вероятно, он станет более привычным для людей, переходящих с MySQL или Microsoft SQL Server. Я не знаю H2, но я предполагаю, что обе синтаксические формы имеют доступ к одной и той же внутренней функции.
Я нашел документы для H2. Похоже, что IDENTITY
и AUTO_INCREMENT
используют SEQUENCE
.