ワーカー プロセスのプールによって処理される長時間実行されるユーザー操作があります。データの入出力は Azure SQL から行われます。
マスター Azure SQL テーブル構造の列は次のように近似されます
[UserId, col1, col2, ... , col N, beingProcessed, lastTimeProcessed ]
beingProcessed
ブール値で、lastTimeProcessed
DateTime です。すべてのワーカー ロールのロジックは以下に示すとおりであり、複数のワーカー処理 (それぞれが独自の Entity Framework レイヤーを使用) を使用して、本質的beingProcessed
に MutEx の目的でロックを使用しています。
質問beingProcessed
:上記の負荷に基づいて、「ロック」自体の同時実行の問題にどのように対処できますか? read-modify-write
ニーズに対する操作はbeingProcessed
アトミックである必要があると思います が、他の戦略にもオープンです。他のコードの改良も可能です。
[更新]: ここで何が必要なのだろうかTransactionScope
... http://msdn.microsoft.com/en-US/library/system.transactions.transactionscope(v=vs.110).aspx
コード:
public void WorkerRoleMain()
{
while(true)
{
try
{
dbContext db = new dbContext();
// Read
foreach (UserProfile user in db.UserProfile
.Where(u => DateTime.UtcNow.Subtract(u.lastTimeProcessed)
> TimeSpan.FromHours(24) &
u.beingProcessed == false))
{
user.beingProcessed = true; // Modify
db.SaveChanges(); // Write
// Do some long drawn processing here
...
...
...
user.lastTimeProcessed = DateTime.UtcNow;
user.beingProcessed = false;
db.SaveChanges();
}
}
catch(Exception ex)
{
LogException(ex);
Sleep(TimeSpan.FromMinutes(5));
}
} // while ()
}