2011-10-26 28 views
1

我有一個Project Table,一個涉衆表和一個關聯表(它將ProjectID和StakeholderID作爲外鍵)。如何鎖定.NET事務中的相關行

我想刪除一個Project,但必須先刪除關聯表中的所有項目行。

這裏是方法。 ProjectRow是使用DataSet Designer創建的強類型DataRow。

public void RemoveProject(ProjectRow project) 
    { 
     try 
     { 
      var associations = from a in ds.Association.AsEnumerable() 
           where a.Project == project.ProjID 
           select a; 
      foreach (DataRow assoc in associations) 
      { 
       assoc.Delete(); 
      } 

      project.Delete(); 

      using (TransactionScope scope = new TransactionScope()) 
      { 
       assocTableAdapter.Update(ds.Association); 

       System.Threading.Thread.Sleep(40000); // to test the transaction. 

       projTableAdapter.Update(ds.Project); 

       scope.Complete(); 
      } 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e.Message); 
     } 
    } 

這種方法確實達到所需要的效果(停止在交易過程中被添加到已刪除項目協會),但它似乎把讀和所有的表,所以我甚至不能從項目表讀寫鎖在睡眠期間。

我希望能夠在交易期間將其他項目/利益相關者對添加到關聯表中。我如何實現這一目標? 乾杯。

+0

如果您可以更改表關聯,則可能需要查看「刪除瀑布」。這不是一個代碼解決方案,但它可能是你想要考慮的。 – Tipx

+1

http://blogs.msdn.com/b/dbrowne/archive/2010/06/03/using-new-transactionscope-considered-harmful.aspx –

回答

2

幾個鏈接,但你可以暗示你想要行級鎖定和數據庫引擎可能會或可能不會採取建議。但是,由於您讓庫處理刪除,誰知道它在做什麼(缺少打開分析器和捕獲語句)。它可能很好地發出表鎖,或者你只是不幸地將行鎖升級爲頁鎖,並且您試圖在事務外的查詢中嘗試訪問的行發生在同一頁上。

什麼是身體呢?您需要平衡您的併發需求和不良數據的風險。下面是一個有趣的海報SQL Server Isolation Levels