2

關於SQL Server中鎖定範圍的問題(準確地說SQL Azure)。SQL事務處理器行級別鎖定

場景

使用select語句選擇了一堆記錄。 通過記錄 每個記錄一個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。對於您的情況,這可能過於悲觀。