こんにちは、アンダーソンです。
今回は実際に上級デベロッパーで出題されていたYou have uncommitted work pendingの原因と対策についてを調べていきたいと思います。
You have uncommitted work pending
上級デベロッパー試験では普通にエラー内容が試験に出ます。
エラー内容すらも頭に入れておかないといけないこの試験。なかなかの難易度です。
今回はYou have uncommitted work pendingというエラーです。
キャッチしている例外としてはCalloutExceptionになります。
CalloutExceptionは外部システムへのコールアウトの失敗などのWebサービス処理に関する例外です。そこで発生するYou have uncommitted work pendingですがどんな内容でしょうか。
訳すと、
コミットされていない作業が保留中です
これが出る原因のコードが下記になります。
public with sharing class OrderController(){
public PaqeReference sendOrder(){
Order__c order = new Order__c();
insert order;
ExternalOrder externalOrder = new ExternalOrder(order);
Http h = new Http();
HttpRequest req = new HttpRequest();
req.setEndpoint('https://www.example.org/v1/orders');
req.setMethod('POST');
req.setBody(JSON.serialize(externalOrder));
HttpResponse res = h.send(req);
order = (ExternalOrder)JSON.deserialize(res.getBody(),ExternalOrder.class);
}
}
試験でも同じようなモノが出ていました。
このコードの例外の原因はDML操作とコールアウトです。
Apexでは同一トランザクションでのDML操作後のコールアウトは許可されていないようで
それが原因でYou have uncommitted work pendingが出る原因になります。
エラーの回避方法
コミットされていないと言われてもコミットという宣言がないので、このエラーを回避するには
- 処理の順番を入れ替える
- トランザクションを分ける
の二つです。
まず一つ目はDML操作後にコールアウトではなく、コールアウト後にDML操作をしましょう。
二つ目は完全にコールアウトとDML操作を分けてしまうことです。
まとめ
例外についてもしっかりした知見をもっておけということですね。
また他の例外についてもまとめていきたいと思います。
コメント