Записи SQL с полностью идентичными значениями даты и времени - PullRequest
2 голосов
/ 30 марта 2012

У меня есть приложение Asp.net MVC, работающее в AppHarbor. Ежедневный процесс заказа по электронной почте:

  1. Пользователь вводит свою электронную почту и отправляет ее.
  2. Система обрабатывает заказ и отправляет электронное письмо со ссылкой.
  3. Пользователь проверяет электронную почту и щелкает ссылку, чтобы сделать следующий шаг ...

Дело в том, что между шагами № 2 и № 3 может пройти много времени. Некоторые пользователи проверяют свою электронную почту немедленно, другие через день или даже позже. Главное, чтобы прошло достаточно времени, чтобы приложение на сервере завершилось.

Поэтому, когда пользователь щелкает ссылку, это может означать, что ему придется немного подождать, пока приложение запустится снова ...

Вопрос

Когда обработка шага № 3 обновляется, запись в базе данных обновляется с отметкой времени (тип, конечно, datetime), когда выполнялся шаг № 3. Но вот так: я вижу записи с полностью идентичными временными метками ! Как это может произойти?

Метка времени генерируется на прикладном уровне, а затем отправляет обновленную базу данных. Я использую PetaPoco для доступа к данным.

Что может вызывать одновременную запись нескольких записей? У моего приложения такой маленький трафик, что оно иногда закрывается в течение дня, поэтому мне трудно поверить, что несколько (до трех) пользователей сделал шаг № 3 в то же время. И поскольку это выполняется в одном процессе, я полагаю, это невозможно ...

Что может быть причиной этого?

Обновление кода действительно очень просто

using (var db = this.DataContext)
{
    db.Execute(Sql
        .Builder
        .Append("update dbo.SteppedProcess set Step3ProcessedOn = @0", DateTime.Now)
        .Where("Step3ProcessedOn is null")
        .Where("Id = @0", id));
}

1 Ответ

1 голос
/ 30 марта 2012

ASP.NET работает с несколькими потоками, даже на одном процессоре. Так что это может случиться. Я думаю, это больше похоже на то, что происходит в вашем случае, потому что после закрытия приложения оно должно запуститься. Все запросы, поступающие на этапе запуска, ставятся в очередь и выполняются немедленно и одновременно, как только ваше приложение станет доступным. Это открывает больше возможностей.

И поскольку часы Windows имеют разрешение около 15 мс, велика вероятность того, что одновременный запрос получит одинаковую метку времени.

...