|
かるびの さん 回答ありがとうございます。
>>しかし、そうすると、Me.Requeryをしたにも拘わらず、更新前の
>>ままになってしまいます。また、別のフォームで、
>>Me.RequeryのところにDLookupを使っているものがあるのですが、
>>そちらでも、更新前のデータしか得られません。
>
> これらの事象は、非同期実行よる典型例だと思います。
> 事態が逆転してしまっていますね。実に妙なことだと思います。困惑するばかりです。
そうなんですよね。
非同期実行を防ぐ意味もあってDatabase.Executeを使っているのに、どうして…。
> トランザクション処理は、トランザクション中は、追加クエリなどの結果をメモリにとどめておき、
>CommitTrans により一気にファイルに書き込むものです。
> 全く根拠はありませんが、ここが非同期実行になっているのかもしれません。
> だとすると、トランザクションをやめることが、一つの対策となるかもしれません。
クエリの複数連続実行をしている部分があるので、エラーが起こった場合の
ロールバック処理をするために、トランザクションは使いたいところなんですよね…。
>>WSP.CommitTrans dbForceOSFlush
>>
>>DBEngine.Idle dbRefreshCache
>
> dbForceOSFlush 定数とか、Idle メソッドとかがあるのは、全く知りませんでした。
> また、これらを使ったこともありません。
> なので、これらの効果や使用の是非については、私には何とも言えません。
上記の原因が、メモリ上の命令をデータベースファイルに反映するのが遅れていたり
読み取りにいった時にキャッシュから読んでしまっている可能性を考え、
OSのキャッシュを即座にデータベースファイルへ反映させるためのオプションと、
AccessのReadキャッシュを即座に最新のものにするためのもの(というつもり)です。
ただ、これを付けても付けなくても、結果は変わってないのですが…。
概ね5秒ほど待ってから読みにいくと正常にデータを拾えることから、
Me.RequeryやDLookupの段階でReadキャッシュを読んでしまっている可能性が
高いと思っているのですが(キャッシュの更新間隔がデフォルト設定だと
5秒程度らしいので)、だったらDBEngine.Idle dbRefreshCacheで解決するはず
なのに…。
トランザクションははずしたくないので、どうしてもダメならSleepで5秒待機を
させることにします。ユーザー側からしたら待ち時間が目に付くかもしれませんが、
データ不整合によるエラーを起こすよりはマシなので。
引き続き、参考になることがあればお願いします。
|
|