Как избежать состояния гонки, когда два пользователя вставляют запись в одну таблицу с созданным вручную идентификатором пользователя

Я генерирую userId вручную, т.е. предыдущий userId+1.

но если два или более пользователей читают предыдущий userId и вставляют новую запись.

Таким образом, существует вероятность, что любые два или более пользователей вставляют записи с одинаковым идентификатором пользователя.

2 ответа

Вы можете поставить чтение предыдущего идентификатора пользователя и вставить запись в ту же транзакцию.

Транзакция должна быть настроена на использование соответствующего уровня изоляции: "Сериализуемый" или "Повторяемые чтения", по крайней мере.

При таком подходе приращение идентификатора пользователя будет падать после начала транзакции и перед фиксацией.

СУБД позаботится о состоянии гонки.

Вы должны как-то поставить в очередь свои процессы и убедиться, что только один из них обрабатывается в данный момент времени. Самый простой способ - заблокировать что-либо до select previous userid запрос, и снять блокировку после того, как вы уже вставили запись.

В противном случае это не очень хорошая практика. Системы СУБД имеют лучшие решения для этого. Поиск последовательности, идентичности или auto_increment в документации вашей РСУБД.

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