AppHarbor で実行されている Asp.net MVC アプリケーションがあります。毎日の電子メール注文プロセスがあります。
- ユーザーは電子メールを入力して送信します。
- システムが注文を処理し、リンクが記載された電子メールを送信します。
- ユーザーは電子メールを確認し、リンクをクリックして次のステップを実行します...
問題は、ステップ 2 と 3 の間で多くの時間が経過する可能性があることです。メールをすぐにチェックするユーザーもいれば、1 日後またはそれ以降にチェックするユーザーもいます。主なことは、サーバー上のアプリケーションが終了するのに十分な時間が経過することです。
したがって、ユーザーがリンクをクリックすると、アプリケーションがバックアップを開始するまで少し待たなければならないことを意味する場合があります...
質問
ステップ #3 がデータベース内のレコードを処理すると、datetime
ステップ #3 が行われたときのタイムスタンプ (タイプはもちろん) で更新されます。しかし、これを理解してください:完全に同一のタイムスタンプを持つレコードを見ることができます!どうすればそれが起こりますか?
タイムスタンプはアプリケーション層で生成され、更新されたものをデータベースにプッシュします。データアクセスには PetaPoco を使用しています。
複数のレコードが同時に記録される原因は何ですか? 私のアプリケーションはトラフィックが非常に少ないため、実際には日中にシャットダウンすることがあるため、複数 (最大 3 人) のユーザーがまったく同時にステップ 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));
}