[salesforce]APEXコードにおけるトランザクションとロールバック

By |11月 9, 2009|salesforce, |


APEXコードでデータベース操作を行うときのトランザクション管理とロールバックの実行方法まとめ。

参考:Transaction Control

概要

他の多くのシステム同様、APEXコード内でもトランザクションを設定することができます。データベースに対して更新とか削除とか処理を行う際にその一連の処理にトランザクションを設定することで、途中でなんらかのエラーが発生した際にはそのトランザクション内の処理を全てロールバックして全体の処理を無かったことにする、みたいなことが可能です。全ての処理をロールバックせずに細かいロールバックポイントを設定する手段として、セーブポイント、という機能もあります。

セーブポイントの制約事項

  • 一つのトランザクション内にまずSP1、その後ろにSP2と複数のセーブポイントを設定した場合、SP1にロールバックするとその後の処理内ではSP1の後ろにあるSP2は無効になります。
  • トリガーの処理はそれぞれ独立しているので、トリガーをまたぐような処理においてセーブポイントを設定することはできません。例えばリードトリガの中で取引先レコードを更新していて、その後取引先トリガが動いているような場合で取引先トリガ内からリードトリガ内のセーブポイントを参照することはできません。
  • 1つの処理内において最大5つまでのセーブポイントを設定できます。
  • 1つの処理内において最大20回のロールバックが可能です。

サンプルコード

トランザクションとセーブポイント設定のサンプルコード。

[php]
//新規取引先レコード作成
Account a = new account(name = ‘xxx’);
insert a;

//作成した取引先レコードのaccountnumber項目がnullであることを確認
System.assertEquals(null, [select accountnumber from account where id = :a.id].accountnumber);

//accountNumberがnullであるデータベース状態のセーブポイント作成
Savepoint sp = Database.setSavepoint();

//accountnumberを123に更新
a.accountnumber = ‘123’;
update a;

//accountnumberが123であることを確認
System.assertEquals(‘123’, [select accountnumber from account where id = :a.id].accountnumber);

//accoutnumberがnullであるデータベース状態にロールバック実行
Database.rollback(sp);

//accountnumberがnullになったことを確認
System.assertEquals(null, [select accountnumber from account where id = :a.id].accountnumber);
[/php]