2011-10-31 125 views
0

我有一個關於如何在對同一個表執行批量插入時處理sql查詢的問題。如何在執行批量插入時發出選擇查詢

我有一個ASP.NET Web應用程序,它創建了大量使用nHibernate以批處理方式插入表的對象(可能是50000)。即使使用Nhibernate優化,這也需要花費兩分鐘的時間。我在隔離級別設置爲讀取提交的數據庫事務中執行此操作。

在批處理過程中,Web應用程序中的客戶端必須能夠讀取此表中以前創建的數據。但是,他們不應該讀取未被公開的數據。我的問題是,如果我在選擇查詢中使用隔離級別「讀取已提交」,它們會超時,因爲它們正在等待批量插入作業完成。

有沒有辦法以這種方式查詢數據庫,以便查詢運行速度快並返回表中的所有提交行而無需等待批量插入作業完成?我不想返回任何未提交的數據。

我測試過將隔離級別設置爲「快照」,這似乎解決了我的問題,但它是最好的方法嗎?

問候異想天開

+0

您是否可以選擇將批次拆分爲幾個較小的批次,以便它需要幾秒鐘而不是幾分鐘並獨立提交? – 9000

+0

不幸的是,在這種情況下,它必須是全部或沒有。 – whimsical82

回答

1

快照隔離返回前事務的開始就存在的數據,因此它不會阻止它不是做在桌子上的鎖。它也忽略了其他鎖定事務,所以在你的場景中,它聽起來像是最適合你的。它的意思是,因爲你的數據被插在一個批次,沒有從該批次的數據將提供給SELECT語句,直到批量完成(即)

  • 時間1:數據集A存在於表
  • 時間2:批量開始將數據集B插入表(但不提交)。
  • 時間3:應用程序拍攝快照,並讀取數據集A.
  • 時間4:應用程序完成反射數據集A(並且只有數據集A)。
  • 時間5:批量完成寫入數據集B;數據集A和數據集B均爲 ,均可在表中找到。
+0

謝謝。我將使用SNAPSHOT隔離級別! – whimsical82