排他強化機能(ProRevision)の解説
はじめに)
 本書は、Xcuteで提供される強力な排他機能(ProRevision)の解説書です。
 一般にデータベースでは、、AとBの2人が同じデータに書き込みを行うと、後からの書き込みが有効(後勝ち)となります。
 この後勝ちの原則では、AとBが同じレコードを対象に、Aがある修正をおこないデータベースを書き換え後に、Bが何も修正しないでWriteReportを行うとAの修正結果を戻してデータベースを書き換えてしまい結果として不具合が発生します。
 この不具合を解消するのが、これから述べる排他の強化機能で、テーブルに「prorevision」というバージョン管理のフィールドを設け、バージョン管理を厳密に行うものです。つぎに、prorevisionフィールドを使ったバージョン管理の概要を解説します。
prorevisionフィールドによるバージョン管理の概要
 下図は、prorevisionフィールドを持つテーブルをExcelへ書き出し(WriteReport)た時です。
Prorevisionは、WriteReport時にはフィールドの値がExcelへ書き出されるだけでほかのフィールドと何ら区別はありませんが、ReadReport時の処理は全く異なりつぎに記述するようになります。
 ReadReport時、Excelに記載されるprorevisionの値はテーブルの値と比較するためにだけ使われます。
2つのprorevision値が一致するなら、このレコードのバージョンは同じと見なされ、Update処理が行われ、prorevisionは+1されます(prorevisionの値が2147483647を超えると1にもどされる)。
2つのprorevision値が一致しない(テーブルのprorevisionの値が大きい)なら、このレコードは既にバージョンがアップされたと見なされ、エラーメッセージが表示されます。
レコードが新規追加される時は、prorevisionは1としてレコードのInsertは行われます。
レコードの削除は、Excelの削除セルにdelと指定された場合ですが、Excelとテーブルのprorevisionが等しい時に行われますが、テーブルのprorevisionを0とします。したがって、prorevision=0のレコードは削除済みのレコードということになります。Prorevision=0のレコードを本当にDeleteする場合は、再度Excelの削除セルにdelを指定します。
以上のように、prorevisionは、レコードがUpdateされる時にExcelの読み取り値とテーブルの値がチェックされ、2つの値が等しいならUpdateが行われ、prorevision自身は+1されるものです。
prorevisionによる排他強化サンプル
prorevisionによる排他強化サンプル「proRevioson」を使って実装例を説明します。
proRevision.plsをXcuteで起動し、ブラウザからつぎのURLを指定します。
http://localhost/procgi/procgi.exe?P=proRevision&WriteReport=MyTable
まず、レコードをInsert,Update,Deleteした時のprorevisionの値の変化の様子をつぎに説明します。
レコードの新規追加(Insert)
レコードの修正と削除(UpdateとDelete)
Deleteされたレコードはprorevision=0とされる。
レコードに修正や削除や追加を行わない時(何もしない)
今度は、排他機能が有効に動作することを検証するため、ブラウザを2つ開き、意図的にバージョンの相違を起こさせる。
つぎの画面は、削除されたレコードを指定し修正などを行った時のエラー表示画面です。
prorevisionの組み込みのポイント
 prorevisionを自分のアプリケーションの組み込むには、以下の手順に従うとよいでしょう。
1) データベースのテーブルに、データ型が長整数(4バイトの整数)でフィールド名をprorevisionとするフィールドを追加する。
2) ブラウザでの更新画面を表示する時は、prorevison=0の削除されたレコードを排除するため、prorevision > 0 とフィルターを掛けて検索し、
ブラウザから修正されずにprorevisionフィールドを戻すためテキストボックスのタイプをHiddenとして隠し持たせること。
ReadReport時に、prorevisionなるフィールドがあれば、新規追加時は1とし、更新時はExcelとDBの値をチェックし等しいなら更新を許可しprorevisionは+1され、等しくないなら更新は拒絶されます。また削除セルにDELが指定されていると、prorevisionは0で更新されます。
 レコードの削除については、前記のように1度目のDELでprorevisionが0とされ、もう1度DELを実行すると、テーブルから当該レコードは削除されます。
以上