2014-12-02 29 views
0

我通常不會問這裏的問題,除非我真的被困住了,並且無法在其他地方找到答案。我的問題應該是相當簡單的,如果已經在別的地方回答了,我很抱歉,但我無法找到一個直接的答案。SSIS OLEDB目標不使用快速加載和死鎖

我正在使用SSIS通過OLEDB目標組件將數據插入到表中。我只是使用「表或視圖」的數據訪問模式,而不使用「快速加載」數據訪問模式。我遇到了死鎖問題,因爲有4個SSIS包處理1條記錄以插入到相同的目標表中。它必須設置爲具有不同的SSIS包並且一次處理1條記錄,因爲每個記錄都是源系統中的單個事務。我已經讀過,如果使用「快速加載」數據訪問模式,有一個表鎖選項或沒有。如果我不使用快速加載選項,這是否會自動鎖定表格,或者在沒有使用快速加載時沒有表格鎖定?當兩個SSIS包同時運行並且不知道是否將OLEDB目標設置爲不使用快速加載選項可能是造成死鎖的原因時,我試圖找到死鎖問題的來源。我不使用快速加載數據訪問模式的原因是因爲此SSIS包一次運行1條記錄,並且在使用快速加載時我遇到了觸發器觸發問題(我知道使用快速加載時的「FIRE_TRIGGERS」選項) 。

我的問題的一個簡單的答案是我正在尋找的,但任何額外的幫助表示讚賞。

+0

包設置爲什麼隔離級別?默認值是SERIALIZABLE,但是您可能在READ COMMITTED時運氣更好。 – 2014-12-02 15:45:09

回答

1

表或視圖模式不使用Tablock提示。您可以通過查看dmv sys.dm_tran_locks
來查看執行包時發生的鎖定。插入操作將對錶進行一定級別的鎖定 - 也許在頁面上有IX和在關鍵字上有X.

插入操作本身不會導致死鎖,每個插入操作都會等待對方,直到它們全部完成。另一方面,如果觸發器在同一個表上佔用額外的鎖,但正在等待另一個插入完成,則可能導致死鎖。即

  1. 插入1開始
  2. 插入2開始從插入1
  3. 觸發火災和正在等待插入從插入2 2
  4. 觸發火災和正在等待插入1

所以看看觸發器在做什麼。他們是否有良好的指標來執行他們的操作,或者他們在做掃描並升級鎖? 您可能會考慮禁用觸發器,執行插入,然後執行觸發操作作爲後續步驟。 無論如何,要測試這個理論,請禁用觸發器並查看是否發生死鎖。然後看看執行計劃,看看它們是否可以通過更好的索引進行改進。