| 排他強化機能の解説 |
| はじめに) |
| 本書は、Xcuteで提供される強力な排他機能の解説書です。 |
| Xcuteでは、従来より、データベースを壊さないことを主眼とした排他処理を提供していました。これは、proles.iniファイルのRollBack=1と設定することで有効になり、レポートを書き込み処理中は、レポートに接続されるすべてのテーブルをロックした後に書き込みを行うものです。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を実行すると、テーブルから当該レコードは削除されます。 |
|
|
|
|
|
|
|
以上 |
|
|
|
|
|
|
|
|