2017-01-05 54 views
0

我正在使用TransactionScope,這樣我就可以確定我的所有數據都被刪除了&保存或一切回滾。C#TransactionScope - 鎖定記錄問題

但是這裏的問題是我的記錄更多&它需要太多的時間來刪除記錄&另一方面記錄被鎖定爲其他用戶。

這裏是代碼: -

using (var scope = new TransactionScope()) 
{ 
     using (var ctx = new ApplicationDbContext(schemaName)) 
     { 
     // Delete 
     foreach (var item in queries) 
     { 
      // Delete queries - more than 30 queries - optimized already 
      ctx.Database.ExecuteSqlCommand(item);     
     } 

     // Bulk Insert 
     BulkInsert(ConnectionString, "Entry", "Entry", bulkTOEntry); 
     BulkInsert(ConnectionString, "WrongEntry", "WrongEntry", bulkWrongEntry); 
     } 
     scope.Complete();   
} 

foreach循環進行刪除操作需要&引起的記錄鎖定太多時間。如果我從TransactionScope中取出代碼,那麼我將無法回滾。

這是什麼方法?有沒有其他方法可以加快通過類似批量刪除的刪除操作?

- 增加

DELETE FROM [Entry] 
WHERE CompanyId = 1 
    AND EmployeeId IN (3, 4, 6, 7, 14, 17, 20, 21, 22,....100 more) 
    AND Entry_Date = '2016-12-01' 
    AND Entry_Method = 'I' 

員工ID是不同ENTRY_DATE不同。對於查詢

執行計劃: -

enter image description here

+0

使用存儲過程。不幸的是交易只適用於短期操作。 – buffjape

+1

在事務之外準備一個臨時表,刪除所有要刪除的行的主鍵值,啓動一個事務併發出1條刪除語句,將它們全部刪除。但是,如果您正在執行的語句都是針對不同的表格,而這不可能。 –

+0

當你說「太多時間」時,你的意思是什麼?我們在說毫秒嗎?秒?分鐘?小時?而「超過30」,在特定場景中有多少? 35? 350? 3500? 350萬? –

回答

1

TransactionScope默認Serializable層隔離。這是最安全的級別,但也是最不安全的級別。您經常要明確設置更常見的隔離級別:

using (var scope = new TransactionScope(
      TransactionScopeOption.Required, 
      new TransactionOptions() { IsolationLevel = IsolationLevel.ReadCommitted })) 
{ 
    ... 
} 
+0

謝謝你的回答,我會試試這個東西。 – Anup

1

您是否擁有正確的索引設置? 我會建議您爲其中一個刪除查詢提取執行計劃,並檢查最多的費用。

如果可能的話,添加一個索引來解決問題!

+0

我已經在EmployeeId&Entry_Date上有索引,如果我直接在SQL Server中刪除這些查詢,那麼它也需要時間。這裏的問題是鎖定和回滾。 – Anup

+0

@Anup是的,我明白查詢需要時間,無論你在哪裏執行它,但有一些運氣,你可以通過查看執行計劃,並找出是什麼讓它如此緩慢運行更快.. – Peter

+0

感謝您的建議,我只是設法運行我的1刪除查詢並附上執行計劃的圖像,請指導我,因爲我不知道索引太多。 – Anup