2

我有一个在 AppHarbor 上运行的 Asp.net MVC 应用程序。它有日常的电子邮件订购流程:

  1. 用户输入他们的电子邮件并提交。
  2. 系统处理订单并发送带有链接的电子邮件。
  3. 用户检查电子邮件并单击链接以执行下一步...

问题是在步骤#2 和#3 之间有很多时间可以过去。有些用户会立即检查他们的电子邮件,有些用户会在一天甚至更晚之后查看。主要是足够的时间可以通过服务器上的应用程序结束。

因此,当用户单击链接时,这可能意味着他们必须等待一段时间才能启动应用程序...

问题

datetime当步骤 #3 处理数据库中的记录时,会在步骤 #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));
}
4

1 回答 1

1

ASP.NET 正在运行多个线程,即使在单个 CPU 上也是如此。所以这可能会发生。我想这更像是在您的情况下发生,因为在应用程序关闭后,它需要启动。在启动阶段进入的所有请求都会排队并在您的应用程序可用后立即同时执行。这打开了更大的机会之窗。

而且由于 Windows 时钟的分辨率约为 15 毫秒,因此同时请求很有可能获得相同的时间戳。

于 2012-03-29T20:47:13.323 回答