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

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

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

Re[1]: MDBでFOR UPDATE相当


(過去ログ 36 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■18719 / inTopicNo.1)  MDBでFOR UPDATE相当
  
□投稿者/ 鶏唐揚 (119回)-(2008/05/15(Thu) 18:05:07)

分類:[データベース全般] 

[VB]2005
[DB]Access MDB

お世話になっております。
今回はSQLの質問です。
Oracleは経験あるので同じ感覚でSQLを書いていたところ、
FOR UPDATEのついたSQLで「演算子がありません」例外が発生してしまいました。
MDBではFOR UPDATE使えないようなのですが、代替機能か句があればご教示願いたいと思います

検索語句:
「MDB 行ロック」「SQL FORUPDATE MDB」「演算子がありません MDB FORUPDAT」
その他諸々...


#書き込み前にさらに調べたら、Accessは行単位のロックができないみたいな記事を発見…
 マジッスカ
引用返信 編集キー/
■18723 / inTopicNo.2)  Re[1]: MDBでFOR UPDATE相当
□投稿者/ ネタ好き (262回)-(2008/05/15(Thu) 18:21:42)
2008/05/15(Thu) 18:36:03 編集(投稿者)

No18719 (鶏唐揚 さん) に返信
> [VB]2005
> [DB]Access MDB
>
> お世話になっております。
> 今回はSQLの質問です。
> Oracleは経験あるので同じ感覚でSQLを書いていたところ、
> FOR UPDATEのついたSQLで「演算子がありません」例外が発生してしまいました。
> MDBではFOR UPDATE使えないようなのですが、代替機能か句があればご教示願いたいと思います
>
> 検索語句:
> 「MDB 行ロック」「SQL FORUPDATE MDB」「演算子がありません MDB FORUPDAT」
> その他諸々...
>
>
> #書き込み前にさらに調べたら、Accessは行単位のロックができないみたいな記事を発見…
>  マジッスカ

確かに2002の時点で行ロックできなかった事を覚えております。
Accessは元々ローカルデータベースなのでそのような細かい粒度のロックは必要ないと思います。
というのも、ロック粒度を細かくする理由は、トランザクション間でロック対象が重なる割合を少なくして、更新処理を伴うトランザクションの待ち時間を減らすためにするからです。無論これも副作用があり、ロックを管理するためのDBMS(Access)のオーバーヘッドが増大します。ですからAccessの場合、余計にパフォーマンスが低下する恐れがあります。
従ってAccessの場合、そのような粒度でのロックは必要ないとMSに判断されたのだと私は推測しております。
引用返信 編集キー/
■18725 / inTopicNo.3)  Re[1]: MDBでFOR UPDATE相当
□投稿者/ はつね (697回)-(2008/05/15(Thu) 18:44:41)
はつね さんの Web サイト
No18719 (鶏唐揚 さん) に返信
> FOR UPDATEのついたSQLで「演算子がありません」例外が発生してしまいました。
> MDBではFOR UPDATE使えないようなのですが、代替機能か句があればご教示願いたいと思います

残念ながらありません。


> #書き込み前にさらに調べたら、Accessは行単位のロックができないみたいな記事を発見…
>  マジッスカ

残念ながら本当です。

引用返信 編集キー/
■18729 / inTopicNo.4)  Re[2]: MDBでFOR UPDATE相当
□投稿者/ 鶏唐揚 (120回)-(2008/05/15(Thu) 19:06:37)
No18725 (はつね さん) に返信
> ■No18719 (鶏唐揚 さん) に返信
>>FOR UPDATEのついたSQLで「演算子がありません」例外が発生してしまいました。
>>MDBではFOR UPDATE使えないようなのですが、代替機能か句があればご教示願いたいと思います
>
> 残念ながらありません。
>
>
>>#書き込み前にさらに調べたら、Accessは行単位のロックができないみたいな記事を発見…
>> マジッスカ
>
> 残念ながら本当です。
>


OTL


>Accessは元々ローカルデータベースなのでそのような細かい粒度のロックは必要ないと思います。
確かに同時アクセス数も、同時アクセスする確率もそんなに高くないのですが
今回の案件はデータズレが起きるとちとマズいことになる項目が登場しまして…
問題の起きる確率が元々低いとはいえ、対策しておこうという話でした。
(このプログラムはかなり古くからあり、度々機能追加案件が着ているすぱげちーそふとで、
 いままでデータ取得のみだったためMDBが採用されていたようです。
 かといってOracleに変えるほど大規模なものでもないため、MDBでGO!ということに)


テーブルロックはまずいので、ロックフラグを項目に用意してメインの更新処理前に
フラグを立ててやるという苦し紛れな対応をすることにしました。
メイン更新処理よりはフラグのほうが早く更新できるはずなので、ズレる確率も多少は低くなるかな…(T_T

ネタ好きさん、はつねさんありがとうございました。
解決済み
引用返信 編集キー/
■18730 / inTopicNo.5)  Re[3]: MDBでFOR UPDATE相当
□投稿者/ flogger (2回)-(2008/05/15(Thu) 19:09:55)
No18729 (鶏唐揚 さん) に返信
既に解決しているようですが、SQL Server Expressを使う、という選択は
ないのですね。
引用返信 編集キー/
■18732 / inTopicNo.6)  Re[4]: MDBでFOR UPDATE相当
□投稿者/ 鶏唐揚 (121回)-(2008/05/15(Thu) 19:20:19)
2008/05/15(Thu) 19:21:21 編集(投稿者)

No18730 (flogger さん) に返信
> ■No18729 (鶏唐揚 さん) に返信
> 既に解決しているようですが、SQL Server Expressを使う、という選択は
> ないのですね。

1.MDBへのアクセスを実現しているPJ内共通クラス(製造者は既にいない)を解析・改造しなきゃいけないこと
2.共通クラスの使用方法が1の改造により変更された場合、積み重なったスパゲティソースを全て走査し
 対応させなきゃいけないこと(個々の追加案件は小さくても、プログラム自体はそこそこ大きめ)
3.このプログラムの追加案件はだいたい納期が2週間程度とやたら短い
4.このPJのメンバは私含めて二人…1案件あたりの規模はそんな大きくないので人員割り当てられない

ということで怖くて変えられませんw
新案件なら選択の余地はあると思いますが、今回のケースでは見送りします…
解決済み
引用返信 編集キー/
■18739 / inTopicNo.7)  Re[1]: MDBでFOR UPDATE相当
□投稿者/ 魔界の仮面弁士 (730回)-(2008/05/15(Thu) 20:14:16)
2008/05/15(Thu) 21:33:44 編集(投稿者)

No18719 (鶏唐揚 さん) に返信
> #書き込み前にさらに調べたら、Accessは行単位のロックができないみたいな記事を発見…
具体的には、どの記事でしょうか? (もしかしたら、古い記事だったのかも知れませんよ)

行ロックの使用可否は、そのエンジンバージョンによります。
JET 3.5x 系で使えるロックモードは、以下の 3 種です。

 (1) 排他モード
  制限がもっとも強いモード。シングルユーザーモード、DB ロックなどとも呼ばれます。
 (2) レコードセットロック
  テーブルに対し、リードロック/ライトロック/リードライトロックがかかります。
  なお、スナップショットタイプと前方スクロールタイプには使えません。
  テーブルセットタイプとダイナセットタイプのみが対象です。
 (3) ページロック
  もっとも制限が少ないモード。ページサイズは 2048 バイトです。


そして Jet 4.0 では、ページサイズの拡張(4096 バイト)とともに、行単位のロックである
レコードロックが追加されています。これは Access のオプションでいうところの、
「レコードレベルでロックして開く」のオプションにあたります。
VBA でいえば、"Use Row Level Locking" のオプション設定(既定値:False)です。


> 代替機能か句があればご教示願いたいと思います
一応、OLEDB のプロバイダ固有ダイナミックプロパティで指定できます。
ターゲットは(Microsoft.ACE.OLEDB.12.0 ではなく)Microsoft.JET.OLEDB.4.0 です。

まず、DBPROP_JETOLEDB_DATABASELOCKMODE(Jet OLEDB:Database Locking Mode)にて、
アルカトラズモード(DBPROPVAL_DL_ALCATRAZ) を指定してください。値としては VT_I4 の 1 です。
既定値は DBPROPVAL_DL_OLDMODE(0)で、これは従前のページロックなモードです。

続いて、カーソルを開く際に、DBPROP_JETOLEDB_LOCKGRANULARITY(Jet OLEDB:Locking Granularity)を
指定します。こちらも VT_I4 で、DBPROPVAL_LG_PAGE(1)がページロック、DBPROVAL_LG_ALCATRAZ(2)が
行レベルロックです。この設定は、DBPROP_JETOLEDB_DATABASELOCKMODE に DBPROPVAL_DL_ALCATRAZ を
割り当てた場合だけ利用可能である事に注意してください。


……なお、これらは、私が VB6 当時に調べた資料を元にしています。
.NET から利用可能であるかどうかは未検証です。誰か追調査よろしく。m(_ _)m
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -