Работа с параллелизмом со вставками сложная, прямо скажем.Такие вещи, как обновления и удаления, относительно тривиальны, так как вы можете использовать токены параллелизма.Например, при обновлении добавляется предложение WHERE для проверки строки, которая должна быть обновлена, для значения токена параллелизма.Если он не совпадает, это означает, что он был обновлен с момента последнего запроса данных, и затем вы можете реализовать какую-то стратегию восстановления.
Вставки не работают так же, потому что там, очевидно, еще ничего нетсравнить с.Ваша лучшая ставка - несколько запутанная стратегия присвоения некоторого идентификатора определенной вставке.Это должно быть сохранено для столбца в вашей таблице, и этот столбец должен быть уникальным.Когда вы отображаете форму, вы устанавливаете скрытый ввод с уникальным значением, например, Guid.NewGuid()
.Затем он будет отправлен обратно, когда пользователь отправит.Затем он добавляется к вашей сущности, и при сохранении он будет установлен в строке, которая была создана.
Теперь предположим, что пользователь дважды щелкнул кнопку отправки, запустив два почти одновременных запроса.Поскольку для обоих запросов отправляются одни и те же данные формы, в обоих представлениях присутствует один и тот же идентификатор.Тот, кто делает это первым, заканчивает тем, что сохраняет запись в базе данных, в то время как следующий заканчивает тем, что выбрасывал исключение.Поскольку столбец, в который сохраняется идентификатор, является уникальным, и один и тот же идентификатор был отправлен для обоих запросов, второй не удастся сохранить.На этом этапе вы можете поймать исключение и восстановить его каким-либо образом.
Моя личная рекомендация - сделать его понятным для пользователя.Когда вы нажимаете кнопку catch, вы запрашиваете строку, которая фактически была вставлена с этим идентификатором, и вместо этого возвращаете этот идентификатор / данные.Например, скажем, это было для страницы оформления заказа, и вы создавали заказы.Вы, вероятно, собираетесь перенаправить пользователя на страницу подтверждения заказа после завершения.Таким образом, в случае неудачного запроса вы просматриваете фактически созданный заказ, а затем сразу же перенаправляете на страницу подтверждения заказа с этим номером / идентификатором заказа.Что касается пользователей, то они просто перешли прямо на страницу подтверждения, и в результате ваше приложение добавило только один заказ.Бесшовные.