Database.rollback()の簡単解説(初心者向け)

By | July 17, 2021

前書き

初心者の方向けにDatabase.rollback()の仕様と使い方について簡単解説しますノ

Database.rollback()とは?

Database.rollback()メソッドを利用することで、Database.setSavepoint()によって事前登録されていたsavepointまで処理をロールバックすることが可能です。

例えば↓の例では、4行目のDatabase.rollback(sp)によって2行目のSavepointまでロールバックされ、「色々な処理B」がなかったことになります。

(色々な処理A)
Savepoint sp = Database.setSavepoint();
(色々な処理B) 
Database.rollback(sp);
(色々な処理C)

実務で一番多いユースケース

実務で一番多い利用方法は「Apex Codeの一番最初にSavepointを仕込んでおいて、例外発生時に全ロールバックされるようにする」というものです。

基本的に初心者の方はこの1パターンだけでも理解して使えるようになれば十分だと思います。

具体的な実装方法は以下の通り。

・普通のコード

public Class CreateAccount {
  public Account createAccount(String name) {
    Account acc = new Account();
    acc.Name = name;
    return acc;
  }
}

・ロールバック処理付きのレコード

public Class CreateAccount {
  Savepoint sp = Database.setSavepoint();
  try{
    public Account createAccount(String name) {
      Account acc = new Account();
      acc.Name = name;
      return acc;
    }
  }catch(Exception ex){
    Database.rollback(sp); 
  }
}

Apex Codeの処理全体をtryで囲い込んだうえで、一番初めにSavepointを設置し、catchにrollbackメソッドを記述することで、当該のトランザクションでエラーが発生した場合に全てのApex処理をロールバックすることができるようになります。

この実装のポイントは「エラーが発生した場合、全てをなかったすることにできるので、データの不整合の発生を必ず防止できる」という点です。

catchにrollbackを置いているため、Apex処理終了後のワークフローやフローでエラーが発生した場合であっても(同一トランザクション内のエラーである限り)ロールバックが機能します。

そのため、「ApexのDML操作だけ反映されて、フローのDML操作だけエラーで弾かれる」といった事象発生を防止できます。