
問題
テクノロジー業界に属する200以上のアカウントがある環境で、次のコードスニペットを実行した場合、
Apexトランザクション中にどのイベントが発生するでしょうか?
2つ選択してください。
for(Account thisAccount : [SELECT Id, Industry FROM Account LIMIT 150] ) {
if(thisAccount.Industry=='Technology') {
thisAccount.Is_Tech__c=true;
}
update thisAccount;
}
A.Apexトランザクションは、キャッチされなかった例外に関係なく成功し、処理されたすべてのアカウントが更新されます。
B.Apexトランザクションは次のエラーメッセージで失敗します。「SOQLクエリでAccount.Is_Tech__cフィールドを取得していないため、SObjectの行にアクセスできません」。
C.同期処理で実行されると、ApexトランザクションがDMLガバナー制限を超えて失敗する可能性があります。
D.非同期処理で実行されると、ApexトランザクションがDMLガバナー制限を超えて失敗する可能性があります。
正解
A.Apexトランザクションは、キャッチされなかった例外に関係なく成功し、処理されたすべてのアカウントが更新されます。
B.Apexトランザクションは次のエラーメッセージで失敗します。「SOQLクエリでAccount.Is_Tech__cフィールドを取得していないため、SObjectの行にアクセスできません」。
C.同期処理で実行されると、ApexトランザクションがDMLガバナー制限を超えて失敗する可能性があります。
D.非同期処理で実行されると、ApexトランザクションがDMLガバナー制限を超えて失敗する可能性があります。
解説
A. 不正解 - Apexトランザクションは、キャッチされなかった例外が発生した場合に処理が中断され、すべてのレコードが更新されるわけではありません。
B. 正解 - クエリで Is_Tech__c フィールドを取得していないため、Apexトランザクションは失敗します。
C. 正解 - 同期コンテキストで実行された場合、DMLステートメントがガバナー制限に達し、トランザクションが失敗する可能性があります。
D. 不正解 - 非同期処理ではなく、同期処理でガバナー制限が問題となります。
ポイント
この問題では、200以上のテクノロジー業界のアカウントに対して、特定のコードを実行したときに発生するイベントを問われています。
正しい選択肢は、次の2つです:
1.エラーメッセージが表示される: クエリで Is_Tech__c フィールドを取得していないため、トランザクションは失敗します。
2.DML制限に達する可能性: 同期処理で実行されると、DML操作が制限を超えて失敗する可能性があります。
つまり、コードを実行する際に必要なフィールドを取得しないとエラーが出るし、処理するアカウントの数が多いと制限に引っかかるかもしれないということです。