Блокировка на уровне строк в sql transactioncope

Вопрос о блокировке области в 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();
}

person user275157    schedule 03.01.2012    source источник


Ответы (1)


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

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

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