前書き
初心者の方向けに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操作だけエラーで弾かれる」といった事象発生を防止できます。