SqlBulkCopy在事務內部插入時阻止對錶的任何其他寫入

asp.net c# sql sqlbulkcopy sql-server

在我的Web應用程序中,用戶可以一次插入大量數據,以提高我使用SqlBulkCopy類的性能。對於插入兩個不同表的單個操作,它會運行多次。如果用戶取消操作或失敗,那麼我需要回滾數據,因此我使用隔離級別快照將所有內容包裝在事務中。

我的理解是,使用Snapshot隔離將允許其他用戶同時寫入/讀取表。但是,當一個數據上載發生時,它將阻止對錶的任何其他寫入,直到整個父事務完成。

這是一些顯示問題的簡化代碼。我排除了很多功能,但這個想法保持不變。我迭代了一些內存集合,將它們批量複製到一個表中,將它們退回,然後批量複製到另一個表中。

using (var transaction = myDbContext.Database.BeginTransaction(
System.Data.IsolationLevel.Snapshot))
 {
   var myCollectionOfObjects;

   while(!GetData(ref myCollectionOfObjects))  
   {     

    SqlBulkCopy bulkCopy = new SqlBulkCopy(myCon, transaction);

    //Sets the columns + rows
    SetUp(bulkCopy);

    bulkCopy.WriteToServer();
    //After the bulkcopy operation is complete
    // we retrieve the rows inserted and do another bulk copy to a different table

    var recentlyAddedRows = GetRecentlyAddedRow();

    SqlBulkCopy otherTableBulkCopy = new SqlBulkCopy(myCon, transaction);


    SetUpBulkCopyForOtherTable(otherTableBulkCopy);

    otherTableBulkCopy.WriteToServer();         
     }
    transaction.Commit();
 }

因此,如果一個用戶當前在此事務中,即使它正在回滾,該表的所有其他寫事務也將被阻止,因此將阻止執行相同功能或嘗試寫入該表的其他用戶。

這是預期的行為,有沒有辦法解決這個問題?

編輯

通過查看SQL中應用的鎖,似乎是由於bulkcopy類導致在表對像上設置了獨占鎖(X),就好像您要一次插入一個只應用了意圖鎖在桌子上(九)。仍然不確定是否有辦法解決這個問題,但我認為這是由於鎖定升級造成的。

更改表索引上的允許頁鎖定以及更改批量副本的批量大小已經在我的一些測試中完全鎖定,但它們是不穩定的。

熱門答案

IsolationLevel僅引用讀取而不是寫入。如果您的某個客戶端正在寫入數據,則另一個客戶端應該能夠在事務開始之前讀取數據,但是,它將無法同時寫入。



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因