0

本番組織には、コマンドラインデータローダーを使用してSalesforceに販売データをアップロードするシステムがあります。このデータは一時オブジェクトTempにロードされます。一意のキーを形成するために、数式フィールド(3つのフィールドを組み合わせたもの)を作成しました。オブジェクトの目的は、キーを手動で作成するためのユーザーの労力を軽減することです。

Tempには、キーを使用し てデータを別のオブジェクトSalesDataにアップサートする非同期メソッドを呼び出す挿入後トリガーがあります。SalesDataの挿入/更新トリガーは、さまざまなフィールドをチェックし、別のオブジェクトSalesRecordsのレコードを作成/更新します。挿入/更新が完了すると、一時オブジェクトTempのすべてのレコード が削除されます。SalesRecordsオブジェクトにはトリガーがなく、別のオブジェクトSalesの子です。Salesオブジェクトには、SalesRecordsオブジェクトのフィールドを合計するロールアップフィールドがいくつかあります。

最近、更新されたレコードの一部で以下のエラーが発生しています。UNABLE_TO_LOCK_ROW、このレコードへの排他的アクセスを取得できません

問題を解決するためのいくつかの指針を提供してください

4

5 に答える 5

3

これは、さまざまなトリガー実行または再帰トリガー実行での DML 操作の競合によって引き起こされる可能性があります。非同期実行により、同じレコード、おそらく SalesRecords オブジェクトで複数の後続の更新が発生すると想定します。関連するトリガーの実行が多すぎないように、プロセスを簡素化することをお勧めします。

于 2012-07-05T18:33:58.337 に答える
2

そもそもこれを機能させることができたことに少し驚いています。after トリガーは注意して使用する必要があり、before トリガーを使用できない場合にのみ使用してください。この理由の 1 つは、レコードを変更するために追加の DML を実行する必要がないことです。これは、トリガー前に値を変更するだけで、挿入/更新のコミットが自動的に行われるためです。しかし、アフタートリガーの主な問題は、再帰的なトリガーの発火です。

トリガーの再エントリを回避する簡単な方法の 1 つは、同じ実行スレッドから既にこのトリガーにいるかどうかを示す public static Boolean をクラスで使用することです。

何かのようなもの:

public static Boolean isExecuting = false;

に設定するtrueと、再起動であるトリガー コードは次の方法で回避できます。

if(Class.isExecuting == false)
{
   Class.isExecuting = true;

   // Perform trigger logic
   // ...
}

さらに、トリガーの実行順序を事前に決定することはできないため、フローの他の部分が最初に終了することに依存する削除やその他のデータ変更の問題が発生する可能性があります。

また、カスタムのユニークな 3 分割キーの詳細がわからないと、本当にユニークかどうかなど、そこにも問題があるのではないかと思います。大文字と小文字を区別しないことはよくある間違いであり、Salesforce に 15 文字と 18 文字の ID があるのはそのためです。たとえば、Excel (大文字と小文字を区別しない環境) にエクスポートして VLOOKUP を実行すると、間違ったレコードが見つかることがあります。大文字と小文字を区別しない環境のあいまいさを解消するために、3 桁の計算されたサフィックスが追加されました。

于 2012-07-06T19:41:27.390 に答える
2

この同じエラーをグーグルで検索すると、次の投稿にたどり着きました。

http://boards.developerforce.com/t5/General-Development/Unable-to-obtain-exclusive-access-to-this-record/td-p/345319

これは、これが発生する一般的な原因をいくつか指摘しています。

  1. 共有ルールを計算中です。
  2. 選択リストの値が置き換えられ、置き換えが進行中です。
  3. カスタム インデックスの作成/削除が進行中です。
  4. 最も可能性が低いのは、あなたが同時にアクセスしようとしているレコードを他の誰かがすでに編集しているということです。

他の誰かがそれを必要とする場合に備えて、ここに投稿します。

于 2013-02-22T15:31:52.320 に答える
0

今日、このエラーが複数回発生しました。私たちのベンダーの 1 つが、同じ組織でその間にインストールされたパッケージを更新していたことが判明しました。また、あらゆる種類の問題が発生していました。一部のオブジェクト検証例外が DML でスローされていましたが、エラー メッセージの内容はありませんでした。

于 2014-01-15T18:37:28.670 に答える
-1

解決方法 このエラーは、ロールアップ サマリー フィールドを計算するためのフィールド更新が既に行われている親オブジェクトに対して、ロールアップ サマリー フィールドなどのフィールド更新が試行されている場合に表示されます。これは、トリガーまたは別の Apex ジョブがマスター オブジェクトで実行されていて、それが更新を試みている場合にも発生する可能性があります。

この問題が発生した場合は、バッチ サイズを小さくして再試行するか、別の小さなファイルを作成してインポートすることができます。

于 2013-04-12T13:51:18.830 に答える