我在AppHarbor上运行了一个Asp.net MVC应用程序。它有日常的电子邮件订购流程:
事情是,在步骤#2和#3之间,很多时间都可以通过。有些用户会立即查看他们的电子邮件,有些用户会在一天或更晚的时间最重要的是,有足够的时间可以通过服务器上的应用程序结束。
因此,当用户点击链接时,可能意味着他们将不得不等待应用程序开始备份......
当步骤#3处理时,数据库中的记录在步骤#3发生时使用时间戳(类型为datetime
)进行更新。但请理解这一点:我可以看到完全相同的时间戳的记录!怎么会发生这种情况呢?
在应用程序层生成时间戳,然后将更新推送到数据库。我正在使用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));
}
答案 0 :(得分:1)
ASP.NET正在运行多个线程,即使在单个CPU上也是如此。所以可以发生。我想这更像是在您的情况下发生,因为在应用程序关闭后,它需要启动。在启动阶段进入的所有请求都会排队,并在您的应用程序可用后立即同时执行。这开辟了更大的机会之窗。
由于Windows时钟的分辨率约为15毫秒,因此同步请求很可能会获得相同的时间戳。