ABAP

【SAP】LUW-データの整合性担保

ABAPを実装していく上で、頭に入れておきたい「COMMIT WORK命令」「ROLLBACK WORK命令」についてまとめます。

また、上記2つの命令の役割を整理するにあたり前提となる「LUW」の概念についても合わせて解説します。

LUWの概念を理解していないと、データベースを直接操作するようなプログラムでは致命的な欠陥を生みやすくなってしまうので、ぜひ本記事で概要を理解しておきましょう。

LUW(作業論理単位)とは?

LUWとは、データが1つの状態からまた別の状態に移る間のことを指します。

LUWの考え方では、「会計伝票登録」「中間テーブル更新」の2つの処理を1つの「論理的なまとまり」としてとらえます。どちらかだけが実行されることはない―。2つで1つの処理である、という考え方です。

したがって、上記例でいえばプログラムの外から見た時の取りうるステータスは「①作業前」か「③作業後」しか発生しないということになります。

もし、「会計伝票登録」が完了した後に、「中間テーブル更新」で何らかのエラーが発生したとしたら(「②会計伝票登録済」の状態)、処理エラーであるととらえ、「②会計伝票登録済」の状態を取り消す必要があります。

「②会計伝票登録済」の状態で処理が終わることはない、ということをシステム的に担保することを目的とし、LUWの概念が生まれたのです。

もし仮に、「②会計伝票登録済」の状態をデータベースに保存してしまえば、中間テーブルとのデータの整合性が失われます。

データ整合性担保のために

データの不整合―。すなわち、LUWの途中の状態で処理が止まってしまうことを避け、データの整合性を担保するポイントは2つです。

1つは、COMMIT(DBの更新を確定する)のタイミングをLUWの最後にすること。

もう1つは、LUWの中でエラーが起きたら、ROLLBACK(処理をなかったことにする)を必ずするということです。

SAPでは、COMMITを「COMMIT WORK命令」で、ROLLBACKを「ROLLBACK命令」で処理します。ここからは、両命令の構文を解説していきます。

構文ルール:COMMIT WORK

COMMIT WORK (AND WAIT).

COMMIT WORK命令は、データベースへの更新を確定させます。

「データベースの更新を確定」というのは、COMMIT WORK命令以前に、UPDATE文やINSERT文で行った処理を確定させるということです。

実は、UPDATE文やINSERT文を実行した状態は「DBへの更新は未確定」の状態です。すなわち、データベースの値は「実際には更新されていない状態」であり、あくまでも更新の依頼をしている状況を作り出すのが「INSERT文」「UPDATE文」であるのです。

この未確定の更新依頼を確定し、データベースの値を事実として書き換える際にCOMMIT WORK命令を用います。

COMMIT WORK AND WAIT

COMMIT WORK命令の後に「AND WAIT」オプションを利用する場合について説明します。

AND WAITオプションを指定しない場合は、COMMIT WORK命令は命令実行後すぐにデータベースの更新が実行されます。すなわち、INSERT文、UPDATE文で更新されたレコードが複数あっても1レコードごとにデータベースに順次コミットするイメージです。

一方、AND WAITオプションを利用する場合、対象のデータベースに対する更新が複数ある場合、複数の更新依頼が行われた後「これ以上更新はない」という状態をもって初めてデータベースへコミットすることになります。

ただし、AND WAITオプションはABAP初心者にとっては理解しづらい部分もあることから、基本的にはあまり利用しない形でコーディングするのがよいでしょう。

構文ルール:ROLLBACK WORK

ROLLBACK WORK.

COMMIT WORK命令の反対です。

すなわち、UPDATE文やINSERT文で依頼されたデータベースの更新を破棄する命令です。

変更を確定せずに、処理を完了させる命令であり、IF/CASE文との組み合わせでCOMMIT WORK命令と対にして利用するのがスタンダードな使い方です。