Newer Version Available
DML の仕組み
単一 DML 操作と一括 DML 操作
DML 操作は、単一の sObject で行うことも、sObject のリストで一括で行うこともできます。一括 DML 操作ではガバナ制限 (Apex トランザクションごとのステートメント数を 150 件に制限する DML 制限など) に達することを防止できるため、この操作を実行することをお勧めします。この制限は、Force.com マルチテナントプラットフォームの共有リソースに公正にアクセスできるようにするために設定されています。sObject のリストで DML 操作を実行すると、sObject ごとに 1 つのステートメントとしてカウントされるのではなく、リストのすべての sObject が 1 つの DML ステートメントとしてカウントされます。
次に、単一の sObject で DML コールを実行する非効率な例を示します。
for ループで取引先責任者を 1 つずつ反復処理し、Department 項目が特定の値に一致した場合に Description__c 項目に新しい値を設定しています。リストに 150 を超える品目が含まれる場合、151 回目の update コールは、DML ステートメント制限の 150 を超えるため、キャッチできない例外を返します。
1for(Contact badCon : conList) {
2 if (badCon.Department = 'Finance') {
3 badCon.Description__c = 'New description';
4 }
5 // Not a good practice since governor limits might be hit.
6 update badCon;
7}次の例は、ガバナ制限に達しないように前の例を変更したものです。取引先責任者のリストで update をコールして DML 操作を一括処理します。これは 1 つの DML ステートメントとしてカウントされるため、150 の制限をはるかに下回ります。
1// List to hold the new contacts to update.
2List<Contact> updatedList = new List<Contact>();
3
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;DML 操作に影響する他のガバナ制限は、1 つのトランザクションの DML 操作で処理できる合計行数 (10,000 行) です。同じトランザクションの全 DML コールで処理されるすべての行は、この制限に対して増分的にカウントされます。たとえば、同じトランザクションで 100 人の取引先責任者を挿入して 50 人の取引先責任者を更新すると、DML で処理された合計行数は 150 行となり、残りは 9,850 行になります (10,000 - 150)。
システムコンテキストと共有ルール
ほとんどの DML 操作はシステムコンテキストで実行され、現在のユーザの権限、項目レベルセキュリティ、組織の共有設定、ロール階層内での位置付け、および共有ルールを無視します。詳細は、「共有ルールの適用」 を参照してください。
DML 操作を匿名ブロック内で実行する場合、現在のユーザのオブジェクトレベルの権限と項目レベルの権限で実行されます。