SalesforceでBulkAPIを使用してデータを削除(特に大量データの削除)の際に発生するエラーの対処方法をまとめました。
1.参照されているレコードは削除できない
メッセージ
DELETE_FAILED: [Name1]は、次の[Object]に関連しているため、削除できません。: [Name2]
エラー内容
削除対象のレコードが別のオブジェクトから参照されているため、エラーになっている。
参照項目の「参照レコードが削除された場合の対処方法」が「参照関係に含まれる参照レコードは削除できません。」の場合に発生する。
[Name1]は削除対象レコードのName
[Object]は参照しているオブジェクト
[Name2]は参照しているレコードのName
対処方法
- 参照されているレコードを先に削除する。
- 参照されているレコードの参照項目をクリアする。
- 「参照レコードが削除された場合の対処方法」をこの項目の値をクリアします。」に変更する。
今後も同じルールで削除を行う場合は、定義を変更した方が良い。
2.タイムアウト
メッセージ
Timeout:It took longer then 10 minutes to process this batch. Trying again later.
エラー内容
処理時間が長いため、タイムアウトしている。
対処方法
外的要因の場合
外的要因でサーバの負荷が一時的に高くなっている可能性もあるので、時間を置いて再実行する。
データ量が多い場合
- 入力ファイルそのものを分割する。
- バッチサイズを小さくする。
3.ロック
メッセージ
UNABLE_TO_LOCK_ROW, unable to obtain exclusive access to this record
エラー内容
他の処理または自身の処理(自身のバッチ間)で同じレコードをロックしている。
削除処理の中で削除対象レコードが参照しているレコードをロックすることがある。
このロックをするレコードが別の処理と重複した場合に、ロックを取得できないためエラーとなる。
対処方法
他の処理が原因の場合
他の処理の終了後に再実行する。
自身の処理が原因の場合
- 入力ファイルをロック対象となっているオブジェクトのキーでソートする。
同じバッチ内にロックするレコードが収まるようにすることが目的。
同じバッチ内ではロックは取り合いにならない。
確実な方法ではないが簡易で概ね解消する。 - 入力ファイルをロック対象となっているオブジェクトのキーが同じレコードが1つのバッチとなるように、入力ファイルを編集する。
手間がかかるが確実な方法。
4.カスケード削除による削除レコードが多い
メッセージ
DELETE_OPERATION_TOO_LARGE:Cascade deletting too many records: occurring when cascading to [objectname] records
エラー内容
カスケード削除によるレコード削除の対象が多いため、エラーになっている。
1つのバッチで削除する件数の上限に、カスケード削除によって削除されるレコードの件数も含まれいると思われる。
対処方法
- バッチサイズを小さくする。
1バッチ当たりの削除件数を減らすことで、カスケード削除による削除レコード件数も減らすことができます。
バッチサイズを小さくしすぎると24時間あたりのバッチ実行上限:10,000に抵触する可能性があるので注意が必要です。 - カスケード削除される対象のオブジェクトを事前に削除する。
1つのバッチで削除するレコード数が減れば良いので、事前に削除しておけばカスケード削除が発生せずに目的のデータを削除できる。
しかし、上記の対処を行っても数日間はゴミ箱(purgeしても同じ)に内部的には存在している扱いになるようで、同エラーが発生することがある。
この場合は一時的にオブジェクトの参照項目をカスケード削除をしない設定にすることをおススメ。
主従関係の場合は参照関係に変更する。