2

Вопрос о возможности блокировки в SQL Server (SQL Azure, если быть точным).sql transactioncope row level locking

Сценарий

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

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

Обрамление вопроса в контексте конкретного примера. В приведенном ниже примере каждый элемент в 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(); 
} 

ответ

2

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

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

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