發表文章

目前顯示的是有「bulk API」標籤的文章

在用 Bulk API in parallel mode load 大量 Data 的時候,容易遇到 record lock contention。其實有個前置處理的小技巧……

小技巧 如果你要 load 的 data 有 Master-Detail 的 Parent 欄位或是 Lookup 欄位,可以試試看先在 csv 檔裡面針對這個欄位做排序。 Salesforce 給的官方建議原文是:P re-sort the child records by parent Id in her CSV file to lessen the chance of parent record lock contention among parallel load batches.   (請參考:  Salesforce Anti-Patterns: A Cautionary Tale  ) 原理說明 因為在 load data 的時候,對應的 parent record/被lookup的 record 會被 lock 住,以維資料正確完整。(可參考這篇詳細說明: ) 如果所 load 的資料未經排序,而 bulk API 又選擇了  parallel mode  ,則對應到同樣 parent record 的child record 就可能散落在平行處理的各個線程( threads)中。就變成各線程你卡我、我卡你,大家都動不了。 如果有先排序,就可以讓同樣 parent 的 child record 都盡可能集中在同一個線程中,一次處理。 就不太會卡來卡去囉~

為什麼常常遇到 Record Lock? 可以如何避免?

當系統愈來愈複雜、data volume 水漲船高、系統間integration 交錯縱橫、automated process 與日俱增……你可能會愈來愈常遇到這種 error message: error: UNABLE_TO_LOCK_ROW, unable to obtain exclusive access to this record 此時你可能會好奇,哪可能就這麼巧、其它人也在同時操作同一個 record!? 其實被鎖住的原因不一定是在這筆 record 本身,以下列兩個可能性: 有太多 child record 擠在同一個 parent record 下。 當 child 被操作的時候,會連同 parent 一起鎖住。所以當你操作的 record 是與很多其它 record 共享一個 parent 時,就有高機率被鎖住。 太多 record 都 lookup 到同一筆 record。 當 record 被操作的時候,會連同此 record 所 lookup 的 record 一起鎖住。所以當你操作的 record 是與很多其它 record 共同 lookup 到同一個 record 時,就有高機率被鎖住。