DML の仕組み
単一 DML 操作と一括 DML 操作
DML 操作は、単一の sObject で行うことも、sObject のリストで一括で行うこともできます。一括 DML 操作ではガバナ制限 (Apex トランザクションごとのステートメント数を 150 件に制限する DML 制限など) に達することを防止できるため、この操作を実行することをお勧めします。この制限は、Lightning Platform の共有リソースに公正にアクセスできるようにするために設定されています。sObject のリストで DML 操作を実行することは、各 sObject に対する 1 つのステートメントではなく、1 つの DML ステートメントと見なされます。
次に、単一の sObject で DML コールを実行する非効率な例を示します。
for ループで取引先責任者を 1 つずつ反復処理します。取引先責任者ごとに、[説明] 項目が特定の値に一致した場合、[説明] 項目に新しい値を設定します。リストに 150 を超える品目が含まれる場合、151 回目の update で、キャッチできない例外が返されます。
1List<Contact> conList = [Select Department , Description from Contact];
2for(Contact badCon : conList) {
3 if (badCon.Department == 'Finance') {
4 badCon.Description = 'New description';
5 }
6 // Not a good practice since governor limits might be hit.
7 update badCon;
8}次の例は、ガバナ制限に達しないように前の例を変更したものです。取引先責任者のリストで update をコールして DML 操作を一括で実行します。このコードは 1 つの DML ステートメントと見なされるため、150 の制限をはるかに下回ります。
1// List to hold the new contacts to update.
2List<Contact> updatedList = new List<Contact>();
3List<Contact> conList = [Select Department , Description from Contact];
4for(Contact con : conList) {
5 if (con.Department == 'Finance') {
6 con.Description = 'New description';
7 // Add updated contact sObject to the list.
8 updatedList.add(con);
9 }
10}
11
12// Call update on the list of contacts.
13// This results in one DML call for the entire list.
14update updatedList;もう 1 つの DML ガバナ制限は、1 つのトランザクションの DML 操作で処理できる合計行数 (10,000 行) です。同じトランザクションの全 DML コールで処理されるすべての行は、この制限に増分的に含まれます。たとえば、同じトランザクションで 100 人の取引先責任者を挿入して 50 人の取引先責任者を更新すると、DML で処理された合計行数は 150 行となり、残りは 9,850 行になります (10,000 - 150)。
システムコンテキストと共有ルール
ほとんどの DML 操作はシステムコンテキストで実行され、現在のユーザーの権限、項目レベルセキュリティ、組織の共有設定、ロール階層内での位置付け、および共有ルールを無視します。詳細は、「共有ルールの適用」を参照してください。
ベストプラクティス
SObject の DML では、新しいインスタンスを作成し、他の項目を照会せずに変更する項目のみを更新することをお勧めします。更新する項目以外の項目を照会すると、クエリと DML の間に変更された可能性のある照会項目値を復元することが必要になる場合があります。