0

トランザクションの実行中に MDB テーブルを読み取りからロックしたいと考えています。私は使用しますdbDenyReadが、明らかにこれは信頼性が低く、常にテーブルをロックするとは限りません。

http://www.office-archive.com/32-ms-access/c2bd1a2553e79c60.htm

セマフォ ソリューションを使用してテーブルの仮想ロックを実現するにはどうすればよいですか?

セマフォを別のテーブルに格納し、テーブル名とトランザクションの終了時にクリアされるプロセス/ワークステーション ID を保持する行がある場合、次のシーケンスを防ぐにはどうすればよいですか?

  1. プロセス A がセマフォ テーブルにクエリを実行し、空白であることを確認します。
  2. プロセス B がセマフォ テーブルをクエリし、空白であることがわかります。
  3. プロセス A は、プロセス A の ID でセマフォ テーブルを更新します。
  4. プロセス B は、プロセス B ID でセマフォ テーブルを更新します。
  5. プロセスAとBの両方がトランザクションを実行します(私が望むものではありません)。

IF私のバージョンのJET-SQLはそれを使用できないため、SQLステートメントの使用を含む回答はありません。

4

1 に答える 1

0

これですべての問題が解決するかどうかはわかりません。ただし、自動生成されない主キーを使用してテーブルを作成します。可能であれば、列に可能な値が 1 つしか含まれないようにする何らかのチェック/ルールを使用して、同じ列を宣言することもできます。

これで、0 行または 1 行を含むことができるテーブルができました。「セマフォ」を取得するには、1 つの固定 PK 値を含む行をテーブルに挿入します。この挿入が成功した場合、セマフォを所有しています。主キー違反が原因で挿入が失敗した場合は、セマフォを取得していません。重要なのは、最初に予備チェックを実行しないことです。挿入を試みるだけです。

PK 制約が維持されることを保証できないほど技術が壊れている場合は、技術の変更を真剣に検討する必要があります。

行の挿入に失敗した場合は、適切と思われる間隔で、このテーブルの定期的なポーリングを開始できます。


もう 1 つの方法は、テーブルに autonumber PK 列を持たせることです。セマフォを取得する場合は、テーブルに行を挿入します。次に、テーブルをクエリして、PK 列の値が最も低い行を見つけます。その行が自分の行である場合、セマフォを所有していることになります。引き続きポーリングする必要がありますが、事実上、このテーブルに「予約」が記録されています。

前のケースと同様に、セマフォで保護された作業が完了したら、テーブルから行を削除します。この 2 番目のアプローチは、(各プロセスが要求の厳密な順序でアクセスを取得するという点で) 「公平」である必要がありますが、実際にはより乱雑に見える場合があります。すべてのプロセスが「ライブ」のままであることに依存しています。

于 2012-09-30T15:28:22.143 に答える