6

我想在我的項目中使用TransactionScope。我閱讀了它,發現它在數據庫中創建了一個隱式事務。我想知道TransactionScope是否鎖定它操縱的表格?TransactionScope鎖定表和IsolationLevel

例如在此代碼:

using (Entities ent = new Entities()) 
{ 
    using (TransactionScope tran = Common.GetTransactionScope()) 
    { 
     var oldRecords = ent.tblUser.Where(o => o.UserID == UserID); 

     foreach (var item in oldRecords) 
     { 
      ent.tblUser.DeleteObject(item); 
     } 

public static TransactionScope GetTransactionScope() 
{ 
    TransactionOptions transactionOptions = new TransactionOptions(); 
    transactionOptions.IsolationLevel = System.Transactions.IsolationLevel.Serializable; 
    return new TransactionScope(TransactionScopeOption.Required, transactionOptions); 
} 

被鎖定tblUser直到Complete命令問題?

是否IsolationLevel在顯式事務中類似於隱式事務?

感謝

回答

9

這是的SQL Server,做鎖定 - 如果需要的話。 任何UPDATEDELETE操作必須得到一個獨佔鎖它影響的那些行 - 如果這些已被另一個事務鎖定,它不能這樣做。

所以在你的情況下,如果你從數據庫中刪除了一些行,默認情況下SQL Server會鎖定那些行只有 - 那些被刪除的行。它不會鎖定整個表格。這是除非一次刪除了很多行 - 如果在單個事務中刪除多於5'000行,SQL Server將嘗試執行鎖升級並鎖定整個表(而不是保持和管理5000多個單獨的行鎖)。

隔離級別只定義了多久閱讀將鎖定一個行 - 行會默認(READ COMMITTED),有共享只爲它的讀取時間鎖定 - 通常是一個非常非常短的時間。在隔離級別爲REPEATABLE READ時,共享鎖將一直保留到當前事務結束,並且SERIALIZABLE將不僅鎖定正在讀取的行,而且鎖定整行範圍。但又說:那只有影響閱讀操作 - 這對DELETEUPDATE聲明沒有直接的影響(不必行上的共享鎖可以防止DELETE從獲取它的其他的排他鎖,它需要)

+0

很好的答案。 @marc_s在上面的代碼中,如果我刪除了'ID = 1'的記錄,那時候另一個線程想要讀'ID = 1'發生了什麼?你說我應該得到排他鎖,但'TransactionScope'得到隱式鎖? – Arian

+0

如果您的DELETE事務獲得排他鎖,則其他事務不能讀取此行 - 它將被鎖定,並且可能會超時 –

相關問題