こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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直前で処理を止められるようにしました。

投稿日時 - 2008-06-16 15:34:32

QNo.4105122

すぐに回答ほしいです

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

dbs.Execute "update [tm_memory_card] set [機種] = '" & Me.[機    種] & "'", dbFailOnError

でやってみてください。先行トランザクションがあればエラーになるはずです。

投稿日時 - 2008-06-16 17:26:46

お礼

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

投稿日時 - 2008-06-17 09:09:00

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

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

投稿日時 - 2008-06-16 15:54:14

補足

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

投稿日時 - 2008-06-17 09:09:26

お礼

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

投稿日時 - 2008-06-24 20:48:45

あなたにオススメの質問