блокировка на уровне строк - PullRequest
2 голосов
/ 03 января 2012

Вопрос о блокировке области действия в SQL Server (точнее, SQL Azure).

Сценарий

Группа записей выбирается с помощью операторов выбора. Мы перебираем записи Каждая запись обновляется в области транзакций - (каждая запись не зависит от другой, и нет необходимости в блокировке таблицы)

Прав ли я, предполагая, что приведенное выше приведет к блокировке уровня строки только этой конкретной строки записи?

Постановка вопроса в контексте конкретного примера. В приведенном ниже примере каждый элемент в itemsToMove будет заблокирован по одному?

var itemsToMove  = ObjectContext.Where(emp => emp.ExpirationDate < DateTime.Now)                        
foreach(Item expiredItem in itemsToMove)
{               
    bool tSuccess = false;
    using (TransactionScope transaction = new TransactionScope())
    {
        try
        {               
            //We push this to another table. In this case Azure Storage.                    
            bool bSuccess = PushToBackup();             
            if(bSuccess)
            {
                ObjectContext.DeleteObject(expiredItem);
            }
            else 
            {
                //throw an exception or return 
                return false;
            }
            ObjectContext.SaveChanges();

            transaction.Complete();
            tSuccess = true;
        }
        catch (Exception e)
        {
            return cResults;
        }       
    }
}
if (tSuccess)
{
    ObjectContext.AcceptAllChanges();
}

1 Ответ

2 голосов
/ 03 января 2012

При условии, что никакая внешняя транзакция / транзакция-обертка не вызывает ваш код, каждый вызов транзакции .Complete () должен фиксировать и снимать любые блокировки.

Просто пара быстрых предостережений

  • SQL не обязательно будет по умолчанию блокировать на уровне строк - он может использовать блокировки на уровне страницы или выше (однако рекомендуется оставить SQL для своих собственных устройств)
  • Обратите внимание, что уровень изоляции по умолчанию для нового TransactionScope () равен read serializable . Это может быть слишком пессимистично для вашего сценария.
...