■ 現在のこのページの役立ち度:
表示されない場合こちらのリンクからもご覧になれます。
■ このページの役立ち度を評価する:
役立ち度を評価してください。
(1(左):あまり役立たない - 5(右):大変役立った):
■ ページの共有:
[ サイト内検索 ]
カスタム検索
#1483-0排他ロックについててんてん2002-01-21(月) 18:47
     #1487-0RE#1483:排他ロックについて魔界の仮面弁士2002-01-21(月) 19:39
     #1489-0RE#1487:排他ロックについて魔界の仮面弁士2002-01-21(月) 20:06
     #1496-0RE#1483:排他ロックについてなぼ2002-01-22(火) 10:29
     #1509-0RE#1496:排他ロックについててんてん2002-01-22(火) 18:07
     #1511-0RE#1509:排他ロックについて魔界の仮面弁士2002-01-22(火) 19:22
     #1520-0RE#1511:排他ロックについててんてん2002-01-23(水) 19:30
#1483-0
排他ロックについて
[VB6.0_SP5]
[ADO2.7&AccessY2K]
はじめましててんてんと申します。
早速質問のですが、
Connection.Open
Recordset.Open "テーブル", Connection, adOpenKeyset, adLockPessimistic, adCmdTable
としてテーブルを開いているのでが、これで開くと排他ロックで開いているはずなのに、実際に開くと
実際に開くと、共有ロックで開かれてしまい困っています。アクセスのヘルプに
「adLockPessimisticを設定するとadLockOptimisticに変更されます。」
と有ったのですが、これを回避できる方法はないのでしょうか?

CurrentProject.BaseConnectionString
VBAなら↑をConnectionStringに与えてやることで回避できるとあったのですが、
VBにには、CurrentProject無いし、VBからやるにはどうしたいいのでしょうか?


それともう一つ質問が有るのですが、
2台のLANでつながったPCで片方のフォルダを、共有にしてそのアクセス権の設定で
フルアクセスと読み取り専用(オプションの設定はいろいろ変えてみました)
すると、フルアクセスと読み取り専用限らず2台目のPCからアクセスしようとした時アクセスできません
どうしてでしょうか。(これはアクセスでも同様のことが起こります。)
片方読取専用だから開けると思ったのですが、ちなみに2台ともフルアクセスに設定しなおすと
Openモードを共有、読み取り限らず開けます。

以上2点です。些細なことでもいいので情報ください。
#1487-0
RE#1483:排他ロックについて
> としてテーブルを開いているのでが、これで開くと排他ロックで開いているはずなのに、実際に開くと

Jetには、テーブル全体をロックするモードがありますが、残念ながら
Microsoft.Jet.OLEDB.4.0は、テーブルロックには対応していません。
代わりに、DAO 3.6 の dbDenyRead dbDenyWrite オプション定数を利用してください。


なお、テーブルロック以外の排他制御に関しては、ADOでも使用可能です。

データベース全体の排他モードであれば、
  objConnection.Provider = "Microsoft.Jet.OLEDB.4.0"
  objConnection.Mode = adModeShareExclusive
  objConnection.Open "Data Source=C:\db1.mdb"
のようになります。

また、テーブル単位ではありませんが、データ単位のロックが使用できます。
これには、4KB単位のデータをロックする「ページレベルロック」と、
編集中のレコードのみをロックする「レコードレベルロック」とがあり、
これらは objConnection.Properties("Jet OLEDB:Database Locking Mode").Value、
もしくは objRecordset.Properties("Jet OLEDB:Locking Granularity").Value を
使って、いずれかを切り替える事ができます。(Jet 4.0の場合)

# (注) Jet 3.5xでは、レコードロックは使用できません。
#      また、ページロックは 2KB単位となります。


> アクセスのヘルプに
> 「adLockPessimisticを設定するとadLockOptimisticに変更されます。」
> と有ったのですが、これを回避できる方法はないのでしょうか?
プロバイダがサポートしていない CursorLocation, CursorType, LockType の組み合わせが
指定された場合、それらは自動的に、別の組み合わせに置き換えられます。これは仕様です。

とりあえず、Microsoft.Jet.OLEDB.4.0 プロバイダにおける組み合わせを表にしてみました。


 『adUseServer』     | adOpenForwardOnly    adOpenKeyset        adOpenDynamic       adOpenStatic
---------------------+-------------------------------------------------------------------------------
adLockReadOnly       | FwdOnly/ReadOnly     Keyset/ReadOnly     Static/ReadOnly     Static/ReadOnly
adLockPessimistic    | Keyset /Pessimistic  Keyset/Pessimistic  Keyset/Pessimistic  Keyset/Pessimistic
adLockOptimistic     | Keyset /Optimistic   Keyset/Optimistic   Keyset/Optimistic   Keyset/Optimistic
adLockBatchOptimistic| Keyset /BatchOpt     Keyset/BatchOpt     Keyset/BatchOpt     Keyset/BatchOpt


 『adUseClient』     | adOpenForwardOnly    adOpenKeyset        adOpenDynamic       adOpenStatic
---------------------+-------------------------------------------------------------------------------
adLockReadOnly       | Static/ReadOnly      Static/ReadOnly     Static/ReadOnly     Static/ReadOnly
adLockPessimistic    | Static/BatchOpt      Static/BatchOpt     Static/BatchOpt     Static/BatchOpt
adLockOptimistic     | Static/Optimistic    Static/Optimistic   Static/Optimistic   Static/Optimistic
adLockBatchOptimistic| Static/BatchOpt      Static/BatchOpt     Static/BatchOpt     Static/BatchOpt
#1489-0
RE#1487:排他ロックについて
>> アクセスのヘルプに
>> 「adLockPessimisticを設定するとadLockOptimisticに変更されます。」
>> と有ったのですが、これを回避できる方法はないのでしょうか?

これって、Jet 4.0 Provider 単体に対する話ではなく、ブリッジプロバイダである
MSDataShape (Microsoft Data Shaping Service)を併用して、
Hierarchical-Recordset を構築した場合の話ではありませんでしたっけ?

先述の表では、 adLockPessimistic → adLockOptimistic への変更は起きていないようですので。。。
#1496-0
RE#1483:排他ロックについて
ロックのほうはおいといてこちらだけ。

> 2台のLANでつながったPCで片方のフォルダを、共有にしてそのアクセス権の設定で
> フルアクセスと読み取り専用(オプションの設定はいろいろ変えてみました)
> すると、フルアクセスと読み取り専用限らず2台目のPCからアクセスしようとした時アクセスできません
> どうしてでしょうか。(これはアクセスでも同様のことが起こります。)

全然意味がわかりません(--; すべて想像でお答えします。

・実際にアクセスできないのはフォルダではなくその下にある Access の MDB 形式ファイルだとする
・実際にアクセスしようとした手法はエクスプローラでファイルの存在を確認したりコピーしたりではなく
 msaccess.exe(もしくは ADO,DAO) で MDB ファイルを開こうとした、という意味だとする
・A PC と B PC があり、例えば A PC に共有フォルダを設定し、A PC に対してフルアクセス、
 B PC に対して読取専用の権限を与えたとする。そのフォルダの下にある MDB をどちらかが先に
 開いていると、必ず後から開こうとした方は MDB ファイルを開くことはできない。

って意味ですか?これでいいですか?いいですね?

だとしたらこの動作は仕様です。

フォルダに対し読取専用の権限しかもたないユーザーがその下にある MDB を開こうとしたとき
Jet エンジンは必ずファイルを「排他」で開きます。
正確に言うと、排他じゃないのに排他と同じ動作をします。
ですので、
・フルアクセス権限(共用)で先に開くと、読取専用権限が排他状態で開こうとして開けない
・読取専用権限(排他状態)が先に開くと、フルアクセス権限が共用で開こうとしても開けない

フォルダに読み取り権限しかないので、MDB ファイルを開くと必ず作られる ldb ファイルを
作ることができません。MDB ファイルを排他で開くときは ldb ファイルは作られないので
ファイルは開けたけど ldb ファイルができてないと、排他で開いたのと同じ動作になるんだそうで。
このように動作して困るのであればフォルダに書き込みの権限を与えましょう。
それしか方法はありません。
#1509-0
RE#1496:排他ロックについて
>なぼさん
わかりにくい説明ですみませんでした。
なぼさんの言う通りのことでOKです。
やはり無理でしたかこの辺は回避しようとするなら恐らく共有で開いて
別に何らかの処理を追加して、いかないといけなそうですね。

>魔界の仮面弁士さん
Connection.CursorLocation = adUseServer
Connection.Provider = "Microsoft.Jet.OLEDB.4.0;pwd=?????"
Connection.Mode = adModeShareExclusive
Connection.Open "Data Source=C:\db1.mdb"
Recordset.Open "名前", Connection, adOpenKeyset, adLockPessimistic, adCmdTable
として開いているのですが、うまいこと排他がかかってくれません。
やはり共有で開いてしまいます。

objConnection.Properties("Jet OLEDB:Database Locking Mode").Value
bjRecordset.Properties("Jet OLEDB:Locking Granularity").Value
これについてはもうちょっと調べて見ます。


>MSDataShape (Microsoft Data Shaping Service)を併用して
に関しては確かに使用されています。
これってADOを使用して上記(ソース)のように接続するとき勝手に使用されてしまうのではないですか?
勘違いでしたらしててしてください。
>Hierarchical-Recordset を構築した場合の話ではありませんでしたっけ?
これってデータベースの右に+がついて階層化されるやつですよね?
でも階層化はさせていないのに・・・なぜだ・・・

#1511-0
RE#1509:排他ロックについて
> として開いているのですが、うまいこと排他がかかってくれません。
> やはり共有で開いてしまいます。
んん? 妙ですね。当方では問題なく排他制御されます。
# フォルダへのアクセス権限が絡んでいるのかな。。。


ところで、前回書き忘れてしまったのですが……排他制御を行うのであれば、
排他レコードにアクセスしてしまった場合の、エラー処理も忘れずに行って下さいね。

例えば、Pessimistic Lock の場合、排他レコードを編集する時にエラーが返りますので、
On Errorトラップを行い、リトライ処理(あるいは更新エラーの表示)を行う必要があります。
それに対し、Optimistic Lock の場合には、編集ではエラーにならず、それを(Update等で)
書き込みに行ったときにエラーが返ります。タイミングが異なるので気をつけてください。


>> MSDataShape (Microsoft Data Shaping Service)を併用して
> に関しては確かに使用されています。
これって、VB等でMSHFlexGridを使うとか、階層化クエリを構築する際に使いますね。


> これってADOを使用して上記(ソース)のように接続するとき勝手に使用されてしまうのではないですか?
MSDataShapeも Jet OLEDBも、それぞれが自体が独立したOLE DB Providerであり、
相互に影響を与えることは無いと思いますよ。(^_^;)

MSDataShapeは、"Data Provider"プロパティで「シェイプ行を提供するプロバイダ」を
必要とはしますが、それが自動的にJet OLEDBになってしまうとは思えませんし、逆に、
Jet OLEDBを指定したのに、プロバイダがMSDataShapeになってしまう…という事も無いでしょう。



排他の話題がでたついでなので、Access VBAの話をしておきます。

今回は、DB#1834にかかれているように『VB6/SP5』という事なので関係無いのですが、
Accessから自身のmdbのデータを、VBA+ADOで排他制御する際には、
CurrentProject.Connectionを、そのまま使う事はできないので、Accessから
排他制御を行う場合は、気をつけてください。

CurrentProject.Connectionを使うと、adLockPessimisticが無効になりますので、
Access VBAにおいては、BaseConnectionStringを使用して、別の接続を用意し、
それを使って、Pessimistic Lockカーソルを生成する必要があります。蛇足までに。
#1520-0
RE#1511:排他ロックについて
    Connection.CursorLocation = adUseServer
    Connection.Provider = "Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Database Password=???"
    Connection.Mode = adModeShareExclusive
    Connection.Open "DBPASS"
  Recordset.Open "名前", Cnn, adOpenKeyset, adLockPessimistic, adCmdTable
  Set MSHFlexGrid.Recordset = Recordset

排他らしき動きはしてくれるようになったのですが、Filterを掛けて、別のレコードを開こうとすると開けません。
データ位置(内部的に?)が近いのかと思いいろいろ、開きなおしているのですが一向に開けません

なおかつ、片方がフィルターで開いた後にそっちの接続を閉じてからもう一方から開こうとすると、
データベースが見つからないといわれて開けなくってしまいます。VBを閉じると開けるのですが
きちんとクローズがかかっていないのかとも思ったのですがクローズしても起こります。

Connection.Mode をadModeShareDenyWrite で開こうとするときちんとレコードが返ってこないのですが
特別な使い方をしないといけないってことは、HELPにも無いのですがいったい何がいけないのでしょうか? 

> 排他レコードにアクセスしてしまった場合の、エラー処理も忘れずに行って下さいね。
もちろん考えております。
やり方はエラートラップして排他で開かれている趣旨のメッセージを出すつもりです

> >> MSDataShape (Microsoft Data Shaping Service)を併用して
> > に関しては確かに使用されています。
> これって、VB等でMSHFlexGridを使うとか、階層化クエリを構築する際に使いますね。
MSHFlexGridを使ってグリッド表示しているのですが、これがまずいのでしょうか?
このページと関連する記事:
#9279-0データベースの排他的ロックについて2000-06-30(金) 16:26
#132-3VBからWordを起動すると、ロックされる2003-04-24(木) 23:37
#45413-0ACCESSよりSELECTした時にレコードロックをかけたい2001-07-27(金) 16:45
#23756-0VB6で保存ができません。2001-10-16(火) 09:21
#230-1排他処理について2004-01-27(火) 12:01
#127-0ADODB.Recordsetのロックタイプについて2001-06-08(金) 18:29
#1433-1ADO経由でACCESSのテーブルをロックする方法1999-07-15(木) 14:33
#24955-0VBを用いた場合のACCESS2000のレコードロックについて2000-07-04(火) 19:35
#12383-0ファイルのロック1999-12-24(金) 22:09
#14390-0アクセスの排他ロックについて2000-01-26(水) 19:03
お探しの情報は見つかりましたか?お困りの問題は解決しましたか?
サイト内検索, 似た記事検索で見つからなくてもあきらめずに掲示板で質問してみましょう。
VB初心者友の会があなたのお役に立てれば幸いです。また、本ページの投稿者の方々にこの場を借りて感謝致します。
本ページは過去ログを集めて自動構成しています。よろしければこのページに関するフィードバックをお願いします。
(※ 構成の誤り、広告等の不適切な記事、リンク切れ、読めないページの報告など)