• ベストアンサー

Transactionで待機状態になりません

Access2003 Win-XPです。 ネットワーク上にmdbを置いて、複数ユーザーで共用して使用していますが、マルチユーザー環境での制御が出来ません。 具体的には、ある人(Aさん)がBeginTransからCommitする間に別の人(Bさん)が同じデータを更新しようとしてBeginTransをスルーしてしまいます。 待機状態になりません。 (いわゆるLockの概念とは違うのでしょうか?) 確かに、Bさんの更新はテーブルへ反映されることはないのですが、何もなかったようにスルーして処理が進んでしまいます。 エラーにもならないのでハンドリングしようがないです。 これでは、Bさんはあたかも自分の更新が成功したかのように錯覚をしてしまいます。 分厚い壁にぶち当たり、何をどうしたらよいのかまったくわかりません。 どなたかご教授ください。 具体的なコーディングは下記です。 Dim ret_value As Variant Dim wsp As Workspace Dim dbs As Database Set wsp = DBEngine.Workspaces(0) Set dbs = CurrentDb wsp.BeginTrans  dbs.Execute "update [tm_memory_card] set [機種] = '" & Me.[機    種] & "'" dbs.Close ret_value = MsgBox("Commit ?", vbYesNo) If ret_value = vbYes Then wsp.CommitTrans Me.Requery Else wsp.Rollback End If テストしやすいように、Commit直前で処理を止められるようにしました。

質問者が選んだベストアンサー

  • ベストアンサー
  • nora1962
  • ベストアンサー率60% (431/717)
回答No.2

dbs.Execute "update [tm_memory_card] set [機種] = '" & Me.[機    種] & "'", dbFailOnError でやってみてください。先行トランザクションがあればエラーになるはずです。

onakichi
質問者

お礼

エラーコード=3218でハンドリングできました! ありがとうございました。

その他の回答 (1)

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.1

Executeの場合、dbSeeChanges などのオプションを付けないと、エラーに ならないのでは?トランザクション管理するなら、レコードセットか DoCmdのRunSQLメソッドを使うべきではないでしょうか。

onakichi
質問者

お礼

dbseechangesを付けてハンドリングできました。 ありがとうございました。

onakichi
質問者

補足

トランザクション管理する場合、Ececuteを使わなければダメだと言われたことがあったので、Executeを使ってみたのですが、なぜ、RunSQLを使かう必要があるのか教えていただけないでしょうか。

関連するQ&A