■102670 / inTopicNo.7) |
Re[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/
|
解決済み
|