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

わんくま同盟

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

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

■102670 / 6階層)  JET/ACE ロックとインデックス フィールドの値の更新
□投稿者/ 魔界の仮面弁士 (3731回)-(2023/12/04(Mon) 10:35:50)
No102645 (eb さん) に返信
> ■バックエンド be.accdb
> table1 (ID, NonIdxedNum, IdxedNum) -- 適当なデータ 2 行

とりあえず、こんな感じで良いですか?

CREATE TABLE [table1]
( [ID] COUNTER(1000, 1)
, [NonIdxedNum] INTEGER
, [IdxedNum] INTEGER
, CONSTRAINT [PrimaryKey] PRIMARY KEY ([ID])
);
CREATE INDEX [Index1] ON [table1] ([ID]) WITH IGNORE NULL;

INSERT INTO [table1] ([ID], [NonIdxedNum], [IdxedNum]) VALUES (100, -100, 123456);
INSERT INTO [table1] ([ID], [NonIdxedNum], [IdxedNum]) VALUES (110, +110, 789012);


2001 年の夏に、VB初心者友の会の Q&A 掲示板に回答したときのメモからの自己抜粋ですが
DAO の場合、Jetエンジンが返すレコードロックに関するエラーとして主な物は、
>> 3197: 共有的ロックで発生します。具体的には、編集中に他ユーザが同一レコードを保存し、
>>    その後で自分が保存しようとした場合に発生します。
>> 3218, 3202: 他ユーザーが排他的ロックをしている時に、レコードを編集しようとしたか、
>>    共有ロック中のレコードが他ユーザーに排他ロックされ、その後で自分が保存しようと
>>    した場合に発生します。(ページロックの場合は、 3260 か 3186 が返されます)
などがあります。OLE DB の場合のエラーコードは未調査。



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

Access 2019 VBA をお使いで、かつ、ACEDAO ではなく、ADODB 限定の話をされていた、という認識で良いですか?
それも、CodeProject.Connection や CurrentProject.BaseConnectionString ではなく、
自データベースとは別の accdb を開くパターンである、と。


> ページ レベル ロックとレコード レベル ロック
それらのロックモードの動作の違いを調べていたのですよね?
質問内容と検証内容が合致していないような…。


Microsoft Access (2000 以上)で .mdb / .accdb を開く場合、オプション設定の
「レコードレベルでロックして開く」が on か off のいずれであるかは確認済みですか?

ここの掲示板の No18719 のスレッド(の No18739 )の解説が言葉足らずだったので補足すると、
>> VBA でいえば、"Use Row Level Locking" のオプション設定(既定値:False)です。

これは要するに、
 Application.SetOption "Use Row Level Locking", False
 Application.SetOption "Use Row Level Locking", True
のことです。
これは、Access のオプション画面の [クライアントの設定]-[詳細設定]にある
「レコードレベルでロックして開く」の項を切り替える物です。
最初にデータベースを開いたユーザーがこの設定をオフにしている場合、
同じデータベースを後から開いたユーザーはページ レベル ロックを使用することになります。


一方、Access を使わず、OLE DB Provider で開く場合には、
この掲示板の No18719 のスレッドにも少し書いたことがありますが、
データベースを "Jet OLEDB:Database Locking Mode=1" 指定で最初に開いた上で、
テーブルを "Jet OLEDB:Locking Granularity=2" 指定で開く必要があるはず。
※後者の既定値は 2 なので、重要なのは前者かな。


'DBPROP_JETOLEDB_DATABASELOCKMODE
'"Jet OLEDB:Database Locking Mode"
' 型: adInteger
' 既定値: 0
' 属性: adPropRead, adPropWrite, adPropRequired
'
' データベースをロックするときに使用される手段。データベースは、一度に 1 つのモードでのみ開けます。
' データベースを開く 最初のユーザーが、データベースを開いている間に使用されるロック モード の決定権を持ちます。
'
' 有効な値の一覧については、MDAC SDK の「付録 C: Microsoft Jet 4.0 Provide が定義するプロパティ値」を参照してください。
'
Const DBPROPVAL_DL_OLDMODE As Long = 0 'Old mode used in previous releases of Jet's storage engine
Const DBPROPVAL_DL_ALCATRAZ As Long = 1 'Alcatraz mode. Enables locking mode that allows for row-level locking. This does not preclude page locking.
'
'A database can be open in only one mode at a time. The first user to open the database determines the locking mode used while the database is open.
Debug.Print rst.ActiveConnection.Properties("Jet OLEDB:Database Locking Mode").Value
'
'
'DBPROP_JETOLEDB_LOCKGRANULARITY
'"Jet OLEDB:Locking Granularity"
' 型: adInteger
' 既定値: 2
' 属性: adPropRead, adPropWrite, adPropRequired
'
' テーブルが Alcatraz 行レベル ロックを使用して開かれるか どうかを決定します。このプロパティは、
' DBPROP_JETOLEDB_DATABASELOCKMODE が DBPROPVAL_DL_ALCATRAZ に設定されていない場合は無視されます。
Const DBPROPVAL_LG_PAGE As Long = 1 'Use page locking for this result set for concurrency control.
Const DBPROPVAL_LG_ALCATRAZ As Long = 2 'Use row-level locking for concurrency control.
'
'Determines whether a table is opened using Alcatraz row-level locking. This property is ignored unless DBPROP_JETOLEDB_DATABASELOCKMODE is set to DBPROPVAL_DL_ALCATRAZ.
Debug.Print rst.Properties("Jet OLEDB:Locking Granularity").Value



No102667 (eb さん) に返信
> JET/ACE に興味のあるエンジニアは少数派でしょうし、
> Excel から ADO で繋いでる EUC 営業マンや事務員も排他制御まで立ち入らないですよね。

Office 2000 Developer CD-ROM をお持ちであれば、ODETools\V9\Samples\OPG\Appendixes フォルダに含まれる
ADOProperties.doc も参照してみてください。

その他、参考になりそうな資料を置いておきます。
多くのサイトが既に閉鎖しているため、Internet Archive からのサルベージも含んでいますが。


日本語【アーカイブ】[MDAC] - [DAO から ADO への移植] - [Jet Provider と組み合わせた ADO の使用 by Alyssa Henry] 全11ページ
https://web.archive.org/web/20030708005542/http://microsoft.com/japan/msdn/data/techmat/ado/dao2ado.asp
https://web.archive.org/web/20030708005542/http://microsoft.com/japan/msdn/data/techmat/ado/dao2ado_11.asp

日本語 [Microsoft OLE DB Provider for Microsoft Jet]
https://learn.microsoft.com/ja-jp/office/client-developer/access/desktop-database-reference/microsoft-ole-db-provider-for-microsoft-jet

英語 [Microsoft OLE DB] - [OLE DB Providers Overview] - [Jet Provider]
https://learn.microsoft.com/en-us/previous-versions/windows/desktop/ms722791%28v%3dvs.85%29

英語 [Access World Forums] - [元スレッド不明] - [whitepaper1of2.doc および whitepaper2of2.doc]
https://www.access-programmers.co.uk/forums/attachments/whitepaper1of2-zip.384/
https://www.access-programmers.co.uk/forums/attachments/whitepaper2of2-zip.385/
解決済み
編集キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←Re[5]: JET/ACE ロックとインデックス フィールドの値の更新 /eb →Re[7]: 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
      └ Re[4]: JET/ACE ロックとインデックス フィールドの値の更新 / eb (23/11/29(Wed) 19:35) #102645
        └ Re[5]: JET/ACE ロックとインデックス フィールドの値の更新 / eb (23/12/02(Sat) 04:37) #102667 解決済み
          └ JET/ACE ロックとインデックス フィールドの値の更新 / 魔界の仮面弁士 (23/12/04(Mon) 10:35) #102670 解決済み ←Now
            └ Re[7]: JET/ACE ロックとインデックス フィールドの値の更新 / eb (23/12/06(Wed) 05:17) #102674 解決済み

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