MS Access 2013 32bit DAO 3.6です。
set wsp = DBEngine.Workspaces(0) set db = wsp.Databases(0) wsp.BeginTrans db.Execute("DELETE FROM Table1 WHERE Key=1", dbFailOnError) ◆ db.Execute("INSERT INTO Table1 (Key, Data) VALUES (1, 'aaa')", dbFailOnError) ★ wsp.CommitTrans
上記コードの★のINSERT文がタイムアウトします。
Table1は、SQLServerに対するリンクテーブルです。
リンクテーブルの接続文字列は、以下の通りです。
ODBC;Driver={SQL Server};Server=DBサーバ;Database=データベース名;Trusted_Connection=Yes;WSID=None;Pooling=False
調べた結果、◆のDELETE実行のセッションよって Key=1のレコードに対してロックがかかっているため、INSERT実行のセッションロック待ちタイムアウトしたことがわかりました。
理由はわかりませんが、DELETE実行のセッションとINSERT実行のセッションが異なっていたのです。
リンクテーブルの接続文字列のDriverから中括弧({})を外して、『SQL Server』にしてコードを実行すると
DELETE実行のセッションとINSERT実行のセッションが同一になり、タイムアウトは発生しません。
誰かこの理由を説明できる人いませんか。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/01/16 00:31