2017-06-21 53 views
1

我的數據流任務鎖定有問題,此任務比較來自同一服務器的幾個表,並將結果插入到正在比較的其中一個表中。被插入的表正被NOT EXISTS子句進行比較。數據流插入鎖

執行快速加載時,執行常規插入時任務會凍結,出現錯誤,此任務會導致死鎖錯誤。

我有2個其他任務對同一個表執行相同的操作,它們工作正常,但插入的信息量更小。我不是在平行運行這些任務。

我正在考慮使用無鎖提示來解決這個問題,因爲這是寫入cerain表分區的唯一任務,但是我只是得出這個結論,因爲我不知道其他任何東西,除了使用臨時表或散列反連接。

回答

3

也許你有所謂的死鎖情況。您的DataFlow任務(DFT)中有兩個單獨的連接實例到同一個表。第一個conn實例運行SELECT並將共享鎖放置在表上,第二個運行INSERT並放置頁面或表鎖。
關於可能原因的幾句話。 SSIS DFT讀取表格行並分批處理。當行數很少時,在一個批次內完成讀取操作,並且在插入操作發生時消除共享鎖定。當行數很大時,SSIS將行分成幾個批次,並進行相應的處理。這允許在數據源完成讀取之前執行DFT數據源之後的步驟。
設計 - 在相同的數據流中讀取和寫入同一表格並不好,因爲可能存在鎖定問題。方法:

  • 將單個INSERT語句中的所有DFT邏輯移出並排除DFT。可能不可能。
  • 拆分DFT,將數據移入中間表,然後 - 使用以下DFT或SQL命令移至目標表。需要額外的表格。
  • 在數據庫上設置讀取已提交快照隔離(RCSI)並在SELECT上使用讀取已提交。僅適用於MS SQL DB。

最普遍的方法是第二個附加表。第三個僅適用於MS SQL。