この記事の目次
Salesforceのfor updateとは?
![](https://b-engineer-media-cms.s3.amazonaws.com/item/image/user/9e08934fd24485c7d9e691a312f16a4ef7ff96eb/9de140bb-a3f3-4651-8f51-e41da958af24.jpg)
for updateの使い方
Salesforceのfor updateは、インラインSOQLステートメントの後に埋め込みます。 ApexコードでsObjectレコードをロックするには、インラインSOQLステートメントの後にfor updateキーワードを埋め込む必要があります。例えば、次のサンプルコードでは、2つの取引先を照会し、返された取引先レコードをロックしています。Account [] accts = [SELECT Id FROM Account LIMIT 2 FOR UPDATE];
ロックを使用する場合は、SOQLクエリでは「ORDER BY」キーワードを使用することができません。
ロックする際に考慮する点
Salesforceのfor updateを使用してsObjectをロックする際、いくつか考慮すべき点があります。 ロックしている間の他のクライアントの動作や、他のクライアントがロックをかけてきた場合の動作など、考慮する点がいくつかあるので以降に説明します。ロック中の別クライアントの動作
Salesforceのfor updateを使用してsObjectをロックしている場合、別クライアントは同じレコードを更新することができません。 for updateを使用してロックしているクライアントは、同一トランザクションでデータベース項目の値を変更することができますが、他のクライアントは同じレコードを更新することができません。 他のクライアントが同じレコードを更新しようとした場合、トランザクションが完了してロックが解除されるまで待つ必要があります。ただし、ロックされている間でも、他のクライアントが同じレコードを参照することはできます。ロック中に別クライアントがロックしようとした場合
Salesforceのfor updateを使用してsObjectをロックしているときに別のクライアントが同じレコードをロックした場合、ロック待機状態となります。 ロック待機状態となった後、ロックが解除されれば、新しいロックを取得することができます。ロック待機状態となった後、10秒以内にロックが解除されなかった場合は、QueryExceptionを取得します。 また、ロック状態のときに別クライアントがロック中のレコードを更新しようとして、10秒以内にロックが解除されなかった場合は、DmlExceptionを取得します。古いレコードで更新しないようにする
for updateのロックが解除された後に別クライアントがレコードを更新する際、古レコードで更新してしまう可能性があるので注意する必要があります。 for updateでロックされているレコードを別クライアントが更新しようとした場合、updateコールが出てからすぐにロック解除されれば、別クライアントがレコードをロックし更新操作が成功します。 ただしこの場合、別クライアントが古い情報のレコードコピーを取得していると、古い情報でレコード更新してしまう可能性があります。 これを回避するためには、他のクライアントがレコードをロックした後、SELECTステートメントを使用してデータベースのレコードの最新のコピーを取得する必要があります。コールアウト実行時の注意点
Salesforceのfor updateを使用してsObjectレコードをロックした後、コールアウトを実行するとロックが自動的に解除されます。 SalesforceのApexコードでfor updateを使用してロックを行った際、コールアウト実行時に自動的にロックが解除されます。for updateが以前に実行された可能性のあるコンテキストでコールアウトを実行する際は注意してください。forループ内でfor updateを使用する方法
![](https://b-engineer-media-cms.s3.amazonaws.com/item/image/user/9e08934fd24485c7d9e691a312f16a4ef7ff96eb/714e52a0-6a4c-461e-a93c-05cf315ac708.jpg)
for (Account[] accts : [SELECT Id FROM Account
FOR UPDATE]) {
// Your code
}
for updateのデッドロックを回避する
![](https://b-engineer-media-cms.s3.amazonaws.com/item/image/user/9e08934fd24485c7d9e691a312f16a4ef7ff96eb/112dc251-2bba-4f58-83a0-712b3bbf922e.jpg)
Salesforceのfor updateを使いこなそう!
![](https://www.pakutaso.com/shared/img/thumb/gori0I9A9903.jpg)
この記事の監修者・著者
![株式会社オープンアップITエンジニア](https://tenshoku-careerchange.jp/wp-content/uploads/2023/07/fzxADbr-_400x400-1-150x150.jpg)
-
未経験からITエンジニアへのキャリアチェンジを支援するサイト「キャリアチェンジアカデミー」を運営。これまで4500人以上のITエンジニアを未経験から育成・排出してきました。
・AWS、salesforce、LPICの合計認定資格取得件数:2100以上(2023年6月時点)
・AWS Japan Certification Award 2020 ライジングスター of the Year 受賞
最新の投稿
- 2024年3月26日キャリア・転職保安職(自衛官・警察・消防官など)に向いている人の性格・特徴ランキング【現役保安職(自衛官・警察・消防官など)36人が回答】
- 2024年3月26日キャリア・転職保安職(自衛官・警察・消防官など)に必要なスキルランキング&スキルアップの方法とは?【現役保安職(自衛官・警察・消防官など)36人が回答】
- 2024年3月26日キャリア・転職クリエイター職(ライター・デザイナー・編集)に向いている人の性格・特徴ランキング【現役クリエイター職(ライター・デザイナー・編集)64人が回答】
- 2024年3月26日キャリア・転職クリエイター職(ライター・デザイナー・編集)に必要なスキルランキング&スキルアップの方法とは?【現役クリエイター職(ライター・デザイナー・編集)64人が回答】