Entity Framework(4.1)を使用してアクセスするSQL Server(2012)があります。データベースには、独立したプロセスが新しいURLをフィードするURLというテーブルがあります。URLテーブルのエントリは、「新規」、「処理中」、または「処理済み」の状態にすることができます。
別のコンピューターからURLテーブルにアクセスし、ステータスが「新規」のURLエントリを確認し、最初のエントリを取得して「処理中」としてマークする必要があります。
var newUrl = dbEntity.URLs.FirstOrDefault(url => url.StatusID == (int) URLStatus.New);
if(newUrl != null)
{
newUrl.StatusID = (int) URLStatus.InProcess;
dbEntity.SaveChanges();
}
//Process the URL
クエリと更新はアトミックではないため、2台の異なるコンピューターでデータベース内の同じURLエントリを読み取って更新することができます。
このような衝突を回避するために、select-then-updateシーケンスをアトミックにする方法はありますか?