Slaesforceのトランザクション・ロールバックを実例付きで解説

(最終更新月:2024年2月)

✔以下の疑問をお持ちの方へ向けた記事です

「Salesforceでトランザクション制御はどのように機能するのか?」
「トランザクション中に発生したエラーへの対処法は?」
「Salesforceでのロールバック操作の実装方法は?」

✔当記事を読むことで得られる知識

  • Salesforceにおけるトランザクション制御の基本概念
  • Apexコードでのロールバック操作の実装と使用例
  • エラー発生時にデータ整合性を保つためのベストプラクティス

Salesforceでは、データベーストランザクションで、複数の操作を一連の処理としてまとめ、これらが全て成功するか、あるいはひとつでも失敗した場合には変更を巻き戻す(ロールバックする)ことが可能。

この機能は、データの整合性を保ちながら安全にデータを操作するために非常に重要なため、Salesforceの開発者や管理者が、アプリケーションの信頼性とデータの正確性を確保するためのガイドとなるでしょう。

ぜひ最後までご覧ください。

Salesforceにおけるトランザクションとは?

Salesforceでのデータ管理やプログラミングにおいて、トランザクションとは非常に重要な概念です。

トランザクションを理解することで、データの整合性を保ちアプリケーションの信頼性を高められます。

  • トランザクションの基本概念
  • Salesforceでのトランザクションの重要性
  • トランザクションの境界とスコープ

トランザクションの基本概念

トランザクションは、一連の操作をひとつの単位として管理する仕組みのこと。

Salesforceでは、これらの操作が全て成功するか、ひとつでも失敗すると全てが取り消される「全てまたはなし」の原則に基づいています。

例えば以下は、Apexコード内でデータを更新する際のコード例です。

Account myAccount = new Account(Name='Sample Account');
insert myAccount;

新しい取引先レコードを作成しデータベースに挿入するコード。

この一連の操作がトランザクションであり、この時点で全体の成功または失敗が決まります。

Salesforceでのトランザクションの重要性

Salesforceのデータモデルでは、多くのオブジェクトがリレーショナルに接続されており、ひとつの操作が複数のオブジェクトに影響を及ぼします。

このような環境において、トランザクションはデータ整合性を維持するために不可欠です。

原子性、一貫性、独立性、持続性といったトランザクションの特性(ACID特性)により、複雑なデータの操作が安全におこなわれます。

トランザクションの境界とスコープ

トランザクションの境界とは、トランザクションが開始され、終了するまでの範囲を指します。

SalesforceにおけるApexコードにおいては、トリガーや、DML操作(データの挿入、更新、削除など)開始点から終了点までが、トランザクションのスコープになります。

スコープの範囲内で発生した全ての変更は成功して初めて確定され、何らかのエラーが発生した場合は、そのエラーが発生した点までの変更がロールバックされます。

ロールバック操作の基礎

ロールバック操作は、トランザクション内で発生した変更を元の状態に戻すための非常に強力な機能です。

Salesforceではこの機能を使うことで、エラーの際にデータを安全に保護できます。

  • ロールバック操作とは何か?
  • ロールバックを使用するシナリオ
  • Apexでのロールバック命令(Database.rollback(savepoint)の使用)

ロールバック操作とは何か?

ロールバックとは、トランザクション内で実行された処理を取り消し、データベースの状態をトランザクション開始時点に戻す操作のこと。

この操作は、不具合やエラーが発生した際に不整合なデータを回避するために必要です。

エラーが発生した場合などは、そのトランザクションがなかったものとして、開始前に戻ります。

もしくは、以下のようなコードを明示的に記述することで、特定の場所に戻ることも可能です。

Database.setSavepoint(); //セーブポイントのセット
Database.rollback(savepoint); //セーブポイントのロールバック

ロールバックを使用するシナリオ

ロールバックは、主に以下のようなシナリオで、トランザクション全体の処理を中断して変更を元に戻します。

  • ユーザーによる意図しないデータの更新を破棄する場合
  • バッチ処理中に一部のレコードでエラーが発生した場合に

このようなシナリオでは、データの整合性を保ちつつ、システムの信頼性を高めるためにロールバックが不可欠です。

Apexでのロールバック命令

Apexにおいて明示的にロールバックをおこなうためには、まずトランザクションの開始時点でセーブポイントを作成する必要があります。

セーブポイントを作成するには、Database.setSavepoint()メソッドを使用

そしてエラーが発生した場合には、Database.rollback(savepoint)メソッドを呼び出して、トランザクションをセーブポイント時点まで戻します。

Savepoint sp = Database.setSavepoint();

try {
    // 複数のDML操作
    update account;
    delete contact;
} catch (Exception e) {
    // エラーが発生したのでロールバック
    Database.rollback(sp);
}

上記の例では、セーブポイントを設定した後、複数のデータベース操作(更新、削除など)を実行。

何らかの例外が発生した場合にエラーハンドリングのブロックが実行され、Database.rollback()を呼び出して全てのDML操作をセーブポイント時点まで戻しています。

Savepointとrollbackのコードは、ロールバックしたい場所を明示的に指定する場合のもの。

本来のトランザクション開始時にロールバックしたいのであれば、セーブポイントの使用はとくに必要ありません。

正しく動作しているかの、テストを必ず実施しましょう。

Apexにおけるトランザクション管理

Apexコーディングにおいてトランザクション管理をすることで、コードの信頼性とデータの整合性を保てます。

トランザクションの範囲を適切に管理することは、システムの健全性維持に役立つでしょう。

  • Savepointの作成と利用
  • エラー発生時のロールバック処理
  • ロールバック後のエラーハンドリング

Savepointの作成と利用

Savepointオブジェクトを作成することで、トランザクション処理の任意のポイントで現在の状態を保存することが可能。

これにより、エラーが発生した時点で、指定したセーブポイントまで戻せます。

Savepointは以下のように作成します。

Savepoint sp = Database.setSavepoint();

Savepointを活用することで、複数のDML操作を含む複雑なビジネスロジックを扱うときにも、安全に処理を制御することが可能です。

エラー発生時のロールバック処理

Apexでは、例外を捕捉するtry-catchブロックを使ってエラー処理をおこないます。

catchブロック内でDatabase.rollback(savepoint)を呼び出すことで、エラーが発生した際に指定の場所へロールバックが可能です。

不正なデータがデータベースに残存するのを防げます。

ロールバック後のエラーハンドリング

ロールバック処理後、エラーメッセージをユーザーに通知するか、ログに記録するなどのエラーハンドリングが必要になる場合があります。

この時、ApexPages.addMessages()やカスタムログ機能などを使用して、エラー情報を適切にフィードバックしましょう。

catch (Exception e) {
    Database.rollback(sp);
    ApexPages.addMessages(e);
}

エラーハンドリングを正確に行うことは、ユーザーエクスペリエンスの向上に直結します。

ロールバックとバルク処理

Salesforceにおけるバルク処理は大量のレコード操作を効率的におこなう手段ですが、トランザクション管理において特別な注意が必要です。

ロールバックを含めたバルク処理戦略を適切に設計することが、システムの効率化につながります。

  • バルクApex操作とトランザクション
  • バルク処理中のロールバック戦略
  • バルクデータ処理のベストプラクティス

バルクApex操作とトランザクション

バルクApex操作、とくにDatabase.insert(records, allOrNone)メソッドなどを使用する場合、allOrNoneパラメータをfalseに設定することで、一部のレコードが失敗しても他のレコードは処理を続けられます。

この方法は大量のレコードを処理する時に有効ですが、トランザクション管理が複雑になりがちです。

バルク処理中のロールバック戦略

バルク処理中にエラーが発生した時のロールバック戦略を事前に計画することは、とくに重要です。

セーブポイントの使用が役立つ場合もあれば、タイミングによっては処理の再設計が必要になるケースもあります。

バルクデータ処理のベストプラクティス

バルク処理をおこなう際は、パフォーマンスとデータ整合性のバランスを取ることが求められます。

以下などを考慮し、さまざまなベストプラクティスを採用することが重要です。

  • バッチサイズの選定
  • 処理の分割
  • ガバナ制限の考慮
  • テストの徹底

ロールバック操作のベストプラクティス

ロールバック操作は、適切に使うことで多くの利点をもたらしますが、不適切な使用により問題を引き起こすこともあります。

ロールバック操作を上手に活用するためのベストプラクティスを理解しましょう。

  • データ整合性の維持
  • パフォーマンスへの影響と最適化
  • テストクラスでのロールバック操作のテスト

データ整合性の維持

ロールバック操作を使う際には、常にデータ整合性を維持することに重点を置くべきです。

トランザクションの開始前にセーブポイントを設置し、予期せぬエラーが発生した場合に元の状態に戻せます

この操作を正しくおこなうことで、データの信頼性を確保することが可能です。

パフォーマンスへの影響と最適化

ロールバック操作は、多くのリソースを消費する可能性があるため、パフォーマンスへの影響を最小限に抑えるための工夫が必要です。

不要なセーブポイントの削減や、トランザクションのサイズの管理など、システムのパフォーマンスを考慮したコーディングを心がけましょう。

テストクラスでのロールバック操作のテスト

Apexコードを実装する際には、テストクラスも重要な役割を果たします。

ロールバック操作もテストクラスで適切にテストすることで、実際の動作を確認し、エラーの場合にデータがロールバックされることを保証する必要があります。

テストメソッド内でセーブポイントとロールバックを使用して、ロジックが期待通りに機能することを検証しましょう。

テスト実行時と実際の操作時では、ロールバックのモデルが異なる場合があります。

本番とテスト環境でそれぞれテストすることをおすすめします。

まとめ

SalesforceおよびApexのトランザクションとロールバック操作は、データの整合性とアプリケーションの信頼性を維持するために重要です。

トランザクション管理の基本からロールバック操作、バルク処理時の戦略、ベストプラクティスまで理解し、効率的で安全なコーディングを心がけましょう。

正確なトランザクションの範囲とスコープの設定や、エラー処理、パフォーマンスへの影響を考慮し、テストを徹底することで、一層信頼性の高いSalesforceアプリケーションの実現が可能になります。