Memos About Salesforce

Salesforceにハマってたこと!

トランザクション ロールバック rollback

こんにちは、管理人の@Salesforce.Zです。

コーディングする先に

たまに失敗するロジックがあり、

エラーありますよね?

そんな時に、エラーが発生したが、

プログラムが実行前の状態にデータを戻す必要が

あります。

こんな時に使うものを共有します。

欲しけりゃくれてやる・・・。

探せ!

この世の全てをそこに置いてきた〜笑



目次

What is rollback

戻すって言葉に理解してもらえばいいではないかと思います。

パソコンもリカバリーがあるので、ある時点に置いた状態を選択して、その時のPCに戻れると似ているような感覚

ちゃんとした解釈

データベース処理において、

トランザクション処理中にエラーが発生した場合に、

そのトランザクション処理を開始する前の状態までデータベースを戻すことである

rollback どう使う

setSavepoint と rollback を合わせて、使用する、

使用アルゴリズム

  1. Database.setSavepoint()ステートメント命令で、ある状態を記録しますよ
  2. Database.rollback(生成したポイント変数)ステートメント命令、記録した状態に戻す

サンプル

Account a = new Account(Name = 'xxx'); insert a;
System.assertEquals(null, [SELECT AccountNumber FROM Account WHERE Id = :a.Id].
                           AccountNumber);

// Create a savepoint while AccountNumber is null
Savepoint sp = Database.setSavepoint();

// Change the account number
a.AccountNumber = '123';
update a;
System.assertEquals('123', [SELECT AccountNumber FROM Account WHERE Id = :a.Id].
                             AccountNumber);

// Rollback to the previous null value
Database.rollback(sp);
System.assertEquals(null, [SELECT AccountNumber FROM Account WHERE Id = :a.Id].
                            AccountNumber);

制限事項

  1. 一つのトランザクション内にまずSP1、その後ろにSP2と複数のセーブポイントを設定した場合、SP1にロールバックするとその後の処理内ではSP1の後ろにあるSP2は無効になります。
  2. トリガーの処理はそれぞれ独立しているので、トリガーをまたぐような処理においてセーブポイントを設定することはできません。

例えばリードトリガの中で取引先レコードを更新していて、その後取引先トリガが動いているような場合で取引先トリガ内からリードトリガ内のセーブポイントを参照することはできません。

  1. 1つ処理内では、最大5つまでのsavepointを設定できます。
  2. 1つの処理内では、最大20回rollbackが可能です。
  3. 欠番の可能性もあり

labyrinth-of-wisdom.hatenadiary.com