Как избежать состояния гонки, когда два пользователя вставляют запись в одну таблицу с созданным вручную идентификатором пользователя
Я генерирую userId вручную, т.е. предыдущий userId+1.
но если два или более пользователей читают предыдущий userId и вставляют новую запись.
Таким образом, существует вероятность, что любые два или более пользователей вставляют записи с одинаковым идентификатором пользователя.
2 ответа
Вы можете поставить чтение предыдущего идентификатора пользователя и вставить запись в ту же транзакцию.
Транзакция должна быть настроена на использование соответствующего уровня изоляции: "Сериализуемый" или "Повторяемые чтения", по крайней мере.
При таком подходе приращение идентификатора пользователя будет падать после начала транзакции и перед фиксацией.
СУБД позаботится о состоянии гонки.
Вы должны как-то поставить в очередь свои процессы и убедиться, что только один из них обрабатывается в данный момент времени. Самый простой способ - заблокировать что-либо до select previous userid
запрос, и снять блокировку после того, как вы уже вставили запись.
В противном случае это не очень хорошая практика. Системы СУБД имеют лучшие решения для этого. Поиск последовательности, идентичности или auto_increment в документации вашей РСУБД.