- ベストアンサー
レコード単位にトランザクションかけられる?
- Access2003 Win-XP で、複数のPCで同じレコードを編集すると、待機中の状態になる現象が発生します。
- ただし、最初にレコード編集中の人がいる場合は、別のPCの人が別のレコードを編集することができ、待機する必要はありません。
- しかし、更新はされていないにも関わらず、更新されたかのように終了してしまいます。対策はあるのでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
エラーにならず、更新も反映されないとなると、 (1)BeginTrans~CommitTransが重複しないで実行された。 (2)DBエンジンのバグ (3)プログラム側の錯誤(エラーをスリ抜けさせてしまうなど) のどれかなんでしょうね。当方で同様の実験しましたが、エラーになりました。 環境は以下の通りです。 OS:XP-Professional SP3 Access:11.0(Jet:4.0、ADO:2.8、VBA:6.05)
その他の回答 (2)
- nda23
- ベストアンサー率54% (777/1415)
繰り返しますが、トランザクションがカブっても、Edit~Updateの時期が 重複しなければエラーになりません。これは不思議なことではありません。 私の言う更新日時の制御とは画面表示用にDBから読み出した時に取得した レコードの更新日時と、更新のために作成したレコードセットから得られる 更新日時(最新の更新日時)を比較するこです。両者が異なるということは 「画面処理中に誰かが更新した=表示内用が古い」ということを意味します。 この場合、最新情報をDBから再取得して内容を確認するか、現行の更新を 強行するかを問い合わせるなどの処置を施します。
補足
すみません。私の説明がへたなせいか質問の主旨が伝わっていないようです。 nda23さんの言われる更新日時の制御は別途行っておりますが、上記のコーディングでは省略しています。 問題は、レコード単位の制御が正常に行われないことです。 同じテーブルで同時に別レコードの編集を行っている人の更新が待機状態にもエラーにもならず終了したにも関わらず、実際のテーブルを見ると更新されていないことなのですが、 質問の主旨が分かっていただけたでしょうか? 何度も分かりづらい説明してしまって申し訳ありません。
- nda23
- ベストアンサー率54% (777/1415)
トランザクション管理とレコードの排他制御は別物で、目的も違います。 トランザクション管理とは一連の複数のテーブル/レコードを更新する場合、 部分的に成功、部分的に失敗ということが起き、テーブル/レコード間で、 矛盾が生じることを防ぐため、成功した更新も無かったこと(RollBack)にし、 全ての更新が成功した時、始めてその内容を反映(Commit)するという 制御です。掲題のように単一テーブルの単一レコードの更新の場合は あまり、意味がありません。 更新の排他制御は同時更新を防ぐもので、更新を開始してから完了する までの間、他の更新を排除するということです。掲題のオプションでは Edit~Updateの間だけロックされますが、期間がズレていれば複数の プロセスで同じレコードを更新してもエラーになりません。 私はこういう場合、ミューテックス代わりにファイルと、更新日時を使って 制御しています。
補足
上記コーディングは、なるべく簡素化して現象だけを検証するために省略したものです。 更新日時による制御は元のコーディングでは行っております。 それでも上記現象が起こるのが不思議です。
お礼
nda23さん、本当にありがとうございました。 また分からないことがありましたら、よろしくお願いします。
補足
なにやら、いろいろ試しているうちに正常に動きました。 デバッグモードで止めたり、closeしなかったり、ワークスペースを開放せずに何度もテストを行ったりした影響かもしれません。 実際に他にも変な動きをした時に、一度mdbを終了させて再度実行すると正常に動く場合がよくありましたので。 今はず~っと正常に動いています。 おそらくそのへんの影響かと思われます。 nda23には、いろいろと調べていただき本当にありがとうございました。 そして、申し訳ありませんでした。