この記事の目次
ガバナ制限とは?

マルチテナント環境とは?
マルチテナント環境とは、互いに無関係な複数のユーザーが同じサーバーやデータベースといった、システムやサービスを共有して利用する方式のことです。 このマルチテナント環境の大きなメリットとして、事業者が事前に用意したシステムなどを利用するため、迅速に利用を開始することができることと、様々なユーザーと共有することで安価に利用することができるということが挙げられます。 デメリットとしては、それぞれのユーザーに合わせたカスタマイズができない、もしくは限定的であることと、各ユーザーに対しリソースを保証できず、「リソースの偏り」が生まれやすいことが挙げられます。 Salesforceでは、マルチテナント環境の大きなデメリットである、「リソースの偏り」を解消するために、ガバナ制限を設けています。制限の対象

トランザクション単位とは
トランザクション単位とは、簡単に説明すれば、一連の複数の処理を一つのものとして処理する時の、一つのまとまりのことを指します。 トランザクションが必要となる場合を、「銀行口座を利用したお金の移動」を例にして説明します。 Aさんが自分の銀行口座である「口座A」から、友人の銀行口座である「口座B」へ1万円の送金を行うとします。ここで行われる処理は、「1.口座Aの残高から1万円を引く」「2.口座Bの残高を1万円増やす」という2つの処理になります。 これらの処理を別々に行ってしまうと、もし1つ目の処理のみが成功し、2つ目の処理が失敗した時、口座Aから引かれた1万円は口座Bへ入ることなく消えてしまい、2つの口座で不整合が起きてしまいます。当然ですがこのような不具合があれば問題となります。 そこでトランザクション単位で処理をすることにより、この問題を解決します。 トランザクション単位では、「口座Aの残高から1万円を引く」と「口座Bの残高を1万円増やす」という2つの処理を一つのものと考えます。そのため、2つの口座の間に不整合が起こらなくなるのです。バッチ処理を利用したガバナ制限エラーの回避方法

Salesforce「Database.Batchableインターフェース」の実装
Database.Batchableインターフェースには、これから紹介する3つのメソッドが含まれています。startメソッド
startメソッドは、Database.QueryLocatorオブジェクトや、Iterableオブジェクトの中でも、ジョブに渡すレコードやオブジェクトが含まれるものを返すものです。 このメソッドは、レコードやオブジェクトを、インターフェースメソッドであるexcuteに渡す際、Apex一括処理ジョブのはじめに利用されます。 SELECTなどの単純なクエリを使用し、一括処理ジョブのオブジェクトの範囲を生成するには、Database.QueryLocatorオブジェクトを使用します。 このオブジェクトを使用することで、SOQLクエリにより取得されるレコード合計数に対してガバナ制限はスルーされるため、リソースの確保に大いに貢献します。global (Database.QueryLocator | Iterable) start(Database.BatchableContext bc) {}
excuteメソッド
excuteメソッドは、メソッドに渡すレコードのバッチごとにコールされ、Database.BatchableContextオブジェクトへの参照や、sObjectsのリストやパラメータ化された型のリストなどを取得します。 このメソッドは、データの処理単位ごとに必要な処理を実行する時に利用されます。global void execute(Database.BatchableContext BC, list
){}
finishメソッド
finishメソッドは、確認メールの送信などの操作を行う場合に使用されます。 このメソッドには注意点が一つあり、すべてのバッチが処理された後に、このメソッドがコールされる、ということです。global void finish(Database.BatchableContext BC){}
ガバナ制限について理解を深め、リソースの確保を!

この記事の監修者・著者

-
未経験からITエンジニアへのキャリアチェンジを支援するサイト「キャリアチェンジアカデミー」を運営。これまで4500人以上のITエンジニアを未経験から育成・排出してきました。
・AWS、salesforce、LPICの合計認定資格取得件数:2100以上(2023年6月時点)
・AWS Japan Certification Award 2020 ライジングスター of the Year 受賞