C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

■102645 / 4階層)  JET/ACE ロックとインデックス フィールドの値の更新
□投稿者/ eb (8回)-(2023/11/29(Wed) 19:35:28)
魔法の仮面弁士様、たびたび申し訳ありません。本当にありがとうございます。
お手数申し訳無いので自己完結しようと思ったのですが、せっかくですので詳しく書きます。

目的は、MS のこの解説の意味を具体的な挙動として把握することでした。

ページ レベル ロックとレコード レベル ロック | Microsoft Learn
https://learn.microsoft.com/ja-jp/previous-versions/office-development/cc376645(v=msdn.10)
>レコード レベル ロックをオンにしても、メモ フィールドやインデックス フィールドの値の更新には適用されないため、これらの操作を行う場合は、ページ レベル ロックに設定してください。

「テストの 2 本」は、正確には、テストを 1 本実行して理解した気になって、
踏まえて次に実務的なものの製作に手を着けたら予想外の挙動があって頓挫した、というのが経緯です。
そのあたりをリセットして、余計なところを全て削ぎ落としてテスト用のデータとコードはこれです。

■バックエンド be.accdb
table1 (ID, NonIdxedNum, IdxedNum) -- 適当なデータ 2 行

■フロントエンド fe1.accdb, fe2.accdb
Sub UpdateIdxedNum()

Dim cnn As ADODB.Connection
Set cnn = New ADODB.Connection
cnn.Open "Provider=Microsoft.ACE.OLEDB.16.0;Data Source=C:\…\be.accdb"

Dim rst As ADODB.Recordset
Set rst = New ADODB.Recordset
rst.Open "table1", cnn, adOpenKeyset, adLockPessimistic

Debug.Assert rst.LockType = adLockPessimistic ' 有効に設定されたかチェック

cnn.BeginTrans
rst.MoveNext ' fe1 ではコメントアウト
rst.Fields("IdxedNum") = Int(Rnd * 10) ' ロック開始
rst.Update ' fe1 ブレークポイント@
cnn.CommitTrans ' fe1 ブレークポイントA

MsgBox "Done!"

rst.Close: Set rst = Nothing
cnn.Close: Set cnn = Nothing

End Sub

手順としては、
fe1 にだけブレークポイント@を置いて fe1 を実行 → fe2 を実行すると、
fe2 は正常終了。行ロックだと解されます。
fe1 にだけブレークポイントAを置いて fe1 を実行 → fe2 を実行すると、
fe2 は rst.update の行で「他でロックされている」とエラー発生。ページロックだと解されます。
……というものなのですが、合っていそうでしょうか。

「私は対 Access での動作を検証したことが無い」が、
Access をお持ちでないというお話であれば検証しかねるかもしれませんが、
どうやらこういう仕様である(?)と、現在私は考えざるを得ないです。
もしかして、当たり前だったりするのかもしれませんが……。



ところで、豊富な情報ありがとうございます。

>紙媒体の古い資料だと、DAO だと ISBN:9784756121899 、ADO だと 9784798101309 で

どちらも面白そうです! 上のようなことまで書かれていそうです。
中古を買ってみようかと調べたら、どちらも高いし厚い!
メモしましたが、Access・ADO の将来性の問題もあるし悩ましいですね(苦笑)。

編集キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←Re[3]: JET/ACE ロックとインデックス フィールドの値の更新 /魔界の仮面弁士 →Re[5]: JET/ACE ロックとインデックス フィールドの値の更新 /eb
 
上記関連ツリー

JET/ACE ロックとインデックス フィールドの値の更新 / eb (23/11/28(Tue) 05:01) #102625
Re[1]: JET/ACE ロックとインデックス フィールドの値の更新 / 魔界の仮面弁士 (23/11/28(Tue) 06:08) #102627
  └ Re[2]: JET/ACE ロックとインデックス フィールドの値の更新 / eb (23/11/28(Tue) 19:30) #102633
    └ Re[3]: JET/ACE ロックとインデックス フィールドの値の更新 / 魔界の仮面弁士 (23/11/29(Wed) 09:38) #102634
      └ JET/ACE ロックとインデックス フィールドの値の更新 / eb (23/11/29(Wed) 19:35) #102645 ←Now
        └ Re[5]: JET/ACE ロックとインデックス フィールドの値の更新 / eb (23/12/02(Sat) 04:37) #102667 解決済み
          └ Re[6]: JET/ACE ロックとインデックス フィールドの値の更新 / 魔界の仮面弁士 (23/12/04(Mon) 10:35) #102670 解決済み
            └ Re[7]: JET/ACE ロックとインデックス フィールドの値の更新 / eb (23/12/06(Wed) 05:17) #102674 解決済み

上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信