0

現在、クライアント/サーバー (TCP 経由) システムを保守しています。サーバーには複数のクライアント (せいぜい数十) がアクセスできるので、FireDAC のような接続プーリングをセットアップします。ほとんどの場合、問題なく動作します。私はまだ1つの問題を抱えています:

クライアント アプリケーションの 1 つが「書き込み」関数 ( nb : データベースへの書き込みを意味する関数) を呼び出し、同じリソースで読み取り関数を呼び出した直後に、古い値 (前回の更新前の値) を取得します。 . この結果は数秒/数百ミリ秒続き、その後、ドライバー層でプロセスが完全に終了していないかのように、結果は良好に戻ります。INSERT クエリでも同じ動作が見られます。

奇妙なことは、DB を更新するために使用している TFDQuery が (.Post 関数を介して) プロセスが終了したかのように非常に迅速に返されることです。amNonBlocking パラメータを使用していませんが、デフォルト値 (amBlocking) を使用しています。自然な動作は、データが完全に更新されたときにのみ .Post 関数が返されるが、明らかにそうではないということだと思います。それはFireDacの問題ですか?それはジェットエンジンの問題ですか?RecordLocking を使用する方法はありますか? MS-ACCESSを含む4つのDBMSで同じ動作を維持する必要があるため、危険だと思います。現在、MS-ACCESS データベースで Delphi XE6 を使用していますが、アプリケーションは Oracle、MS SQL、および PostgreSQL でも実行できる必要があります。

どうもありがとうございました

4

1 に答える 1

1

誰かがこの答えを探しているのであれば、実際には、同時実行を正しく処理する際の MS ACCESS の問題が原因です (特に書き込みコンテキストで)。標準の RDBMS (Oracle、MS SQL Server、PostgreSQL) では、この動作の証拠は見られませんでした。

この特定の機能へのアクセスのサポートを中止する以外に選択肢はありませんでした。

于 2015-03-20T12:29:29.910 に答える