排他強化機能(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を実行すると、テーブルから当該レコードは削除されます。 |
|
|
|
|
|
|
|
以上 |
|
|
|
|
|
|
|
|