ロックとトランザクション: トランザクションとロックの順序

データベースに登録されているデータを編集して書き込む場合、基本的には次の順序を守らなければなりません。

1.トランザクション開始
2.レコードロック
3.編集(修正)・・・メモリ上での作業(遅延トランザクションのキャッシュ含む)
4.データベースへの書込み
5.コミット(確定) or ロールバック(取消)・・・ロック解除

尚、2〜4はレコード1回分の処理とは限りません。
特にバッチタスクでは、複数レコードを同一トランザクション処理として扱うことも多々あります。
(ある意味、そのためのトランザクションですから。)

但し、Pervasvieや、DB2/400をISAMとして使っているときは、次のような簡易型も許されます。
というより、この簡易型の方がデフォルトになります。

1.レコードロック
2.編集(修正)・・・メモリ上での作業(遅延トランザクションのキャッシュ含む)
3.データベースへの書込み&即時コミット(確定)・・・ロック解除

動作環境簡易型かどうかは、動作環境のISAMトランザクションで決まります。
この設定が「No」の場合、ISAMではトランザクションを使わないということになり簡易型として動作します。
(簡易型というのは、当サイトで勝手に名乗っている表現で、汎用的な表現ではありません。)

Magicの開発ではPervasiveの活用も多いと思いますが、デフォルトでトランザクションを使わない設定になっていますので、「特に意識したことはない」という開発者も多いかもしれません。
Pervasiveでのトランザクション使用については注意点がありますので、別記事のPervasiveでトランザクション処理?も参照してください。

OracleやMS_SQL_Serverを使うときは、先述の1〜5の手順が必須です。
Pervasiveを長く使っていた(トランザクションを意識してこなかった)開発者が、OracleやMS_SQLを使うときには、トランザクション開始に注意しなければなりません。
「ロックの前にトランザクション開始」というルールが絶対です。
プログラムチェック(F8)時にも、このルールを無視していると次のエラーが表示されます。
[トランザクション開始]は、[ロック方式]と非互換です。

タスク特性例えば、タスク特性の設定で、トランザクション開始が「U=レコード更新前」、ロック方式が「O=入力時」のような場合は、エラーになります。
オンラインタスクでこの設定になっていると、ロックが発生するのはレコードメインの可能性が高いわけですが、トランザクション開始は、レコード後の後になりますから。
そして、ルールが守られていないプログラムを実行して、データを入力すると次のようなエラーになります。
トランザクション外のため、ビューはロックされません。