- ベストアンサー
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直前で処理を止められるようにしました。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
dbs.Execute "update [tm_memory_card] set [機種] = '" & Me.[機 種] & "'", dbFailOnError でやってみてください。先行トランザクションがあればエラーになるはずです。
その他の回答 (1)
- nda23
- ベストアンサー率54% (777/1415)
Executeの場合、dbSeeChanges などのオプションを付けないと、エラーに ならないのでは?トランザクション管理するなら、レコードセットか DoCmdのRunSQLメソッドを使うべきではないでしょうか。
お礼
dbseechangesを付けてハンドリングできました。 ありがとうございました。
補足
トランザクション管理する場合、Ececuteを使わなければダメだと言われたことがあったので、Executeを使ってみたのですが、なぜ、RunSQLを使かう必要があるのか教えていただけないでしょうか。
お礼
エラーコード=3218でハンドリングできました! ありがとうございました。