У нас есть длительная пользовательская операция, которая обрабатывается пулом рабочих процессов. Ввод и вывод данных осуществляется из 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 ()
}