• 締切済み

ASPでMDBファイルを更新する時のロックについて

こんばんは ASP(VBスクリプト)で MDBファイル(アクセス2000)の データベースを 更新 又は レコード追加 をさせるときの ロックについて悩んでいます。 まず条件として このMDBファイルは 複数のユーザーが共有する物です。 (ここでは仮に A B C と3つのユーザーとします) データの新規登録の時(レコードの追加)はレコード内の項目で 絶対重複しないIDを発行して登録します。 逆に更新の時は そのIDを基に該当レコードを更新します。 また、IDはA*** B*** C*** と言うように 各ユーザーの固有ID+重複しない番号 と言う内容にしています 二重書き込み防止のために色々考えているのですが このIDを基にした方法だと 基本的にはAというユーザーが 同じIDの情報を複数のブラウザ開かない限り二重書き込みには ならないと思っています。 (変更登録などはパスワードで管理して物理的に1人(1画面)しかできないようにしています) なので物理的な2重書き込みはこれで防止できると思っているのですが 正しいでしょうか? ただ、ものすごく悩んでいるのが 1人が1つのデータベースをさわっているのなら良いのですが 複数人が同時に使っている場合、レコードが服従することはないので 2重書き込みはないとしても Aのデータを更新しているときに Bが新しく情報を追加したと言うような 事は起こるはずなので、ファイルが壊れないかと心配しています。 なので cgiで言うような書き込みロックのような事が ASPでもできるのかなと思っています。 ただ、それ以前に こういった使い方はダメでしょうか? (1つを複数人で使うこと) 良くない場合は A、B、C それぞれデータベースを作り それを結合させた方が賢明なのかなとも思っています。 ロックの方法でやるか 個々に作って結合させるか それ以外にもよい方法があるのか これで悩んでします。 また、ロックの場合 Updateではなく Recordsetオブジェクトを使って IDがあれば更新 なければ 追加 と言う方法にしようと 思っていまして その場合 OPENメソッド recordset.Open Source, ActiveConnection, CursorType, LockType, Options で、ロックタイプを3にしても これはUpdateの時だけ有効のようなので 意味がないのかなと思っています ただ MSのHPでの解説で >>レコード単位の共有的ロックを示します。Update メソッドを呼び出した場合にのみ、プロバイダは共有的ロックを使ってレコードをロックします。 と書いているのですが、そもそも >>共有的ロックを使ってレコードをロック と言う意味が分かっていません ファイルを壊さないためにも有効であるなら Updateを使う方法に変えようかとも思うのですが、どうなんでしょうか? なんか 基礎的なことが分かっていないので 分かりにくい質問になりましたが ファイルが壊れないような処理方法を作っていきたいので、ご教授のほど よろしくお願いします。

みんなの回答

  • Lchan0211
  • ベストアンサー率64% (239/371)
回答No.1

まず、データベースアクセスメソッドを経由して アクセスしていれば、複数人が同時にアクセスしても データベースファイル(mdbファイル)そのものが 壊れることはありません。これがデータベースの大きな利点です。 (これがファイル直接更新であれば、複数人が1ファイルを同時更新して 壊れる可能性(ファイルロック)を考える必要があります。) ただし、データベースの場合でも、テーブル内の1つの レコードを複数人が同時更新しようとした場合に どうするか(レコードロック)を考える必要があります。 ご質問の設計だと、AとBが同時に1つのレコードにアクセスすることは ないようなので、ロックのことはさほど気にせず、一つのデータベース を使うことでよいように思います。 「UpdateではなくRecordsetオブジェクトを使って」とありますが、 Microsoftの説明にあるUpdateとは、Recordsetオブジェクトの Updateメソッドのことだと思います。Recordsetを更新する場合でも、 暗黙で自動Updateされることはありますが、基本的にUpdeteメソッドを 明示的に発行すべきです。 Recordset等のADOの使い方は、もう少し勉強した方がよいように思います。 http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpado260/htm/mdobjstream.asp のようなMicrosoftのドキュメントがバイブルになりますが、 少しわかりにくいところもあるので、 http://www.accessclub.jp/ado/index.html のような入門サイトで雰囲気を掴んでから、正確な仕様を Microsoftのドキュメントで再確認する習慣をつけるとよいと思います。 Recordsetの共有的ロック(adLockOptimistic)と排他的ロック(adLockPessimistic)の違いは、 Microsoftの説明はものすごくわかりにくいですが、 http://www.itmedia.co.jp/help/howto/win/win2000/0007special/complus_vb/chapa/a4.html http://www.itmedia.co.jp/help/howto/win/win2000/0007special/complus_vb/chap1/05.html#lock の説明が、かなりわかりやすいと思います。 参考にしてみてください。

関連するQ&A

  • データー登録、更新時のファイルロックは必要なのでしょうか?

    PHPとMySQLを組み合わせて、簡単なデーターベースを作っています。 非公開で、それほど多くの人がアクセスするわけではないのですが、同時使用もありえる状況で新規書込みと内容の更新などが同時に発生する状況も考えられます。 通常のphpのシステムとかですと、ファイルロックについて、いろいろと書かれているのですが、MySQLシステムでファイルロックについて(テーブルロック?)探してもよくわからないのです。 だれかがinsertやupdateしていると、自動的に排他状態になったりしているのでしょうか?

  • Accessのmdbがすぐロックされてしまう。

    お世話になります。 現在access2002を使ってシステムを構築しています。現状を説明させて頂くと, ・私    テーブル,クエリやマクロ等を作成・編集。 ・ユーザー テーブルやクエリを参照。テーブルの中身を編集。 という状況なんですが,ユーザーがクエリ等を開いているだけで全体にロックがかかってしまい,関係ないマクロやクエリの編集が出来ないことがよくあります。 「ユーザーが使う時間帯に編集しない」「先に開いてずっと所有権をもったままにしておく」「参照するようのファイルを別で作りそちらで参照させる。」等の運用面のカバーは思いつくのですが,ユーザーが現在編集しているテーブル以外にロックがかかる状態がやるせないです。 ・既定の開くモード「共有モード」 ・既定のレコードロック「編集済みレコード」 ・レコードレベルでロックして開くにチェック。 この三つを選択しているので,ユーザーがテーブルを開き,何らかの修正を行っていて,完了させるまではテーブル一つだけがロックされるってなればいいと思うんですがそうではないみたいです。 最終的な質問としては,「ユーザーがテーブルの編集をする度に全体にロックがかかってしまうのを防ぐ方法はないでしょうか?」となります。 お手数おかけしますがご回答宜しくお願い致します。

  • SQLiteファイルへの同時アクセス過多によるロックについて

    PHP5.0+SQLite2.8でユーザー投稿型のサイトを個人運営しています。 1日数万ページビューほどの規模で、 データベースのテーブルのレコード数は数万件、 1レコードあたりのカラム数は数十件ほどあり、 そのテーブルに1日数百件の投稿があります。 それらのデータは随時更新・削除・検索されます。 データベースファイルへのINSERT、UPDATE、DELETE、SELECTなどが重なると 「database is locked」とのエラーメッセージが表示され、 それからもずっとユーザーによるデータベースへのアクセスが続くため、 データベースへのアクセスがしづらい、 もしくはまったくできない状態が延々と続いてしまいます。 SQLiteではトランザクション中にファイル全体がロックされるため こうした現象が発生するようですが、 この状態を元に戻す方法はないのでしょうか? ファイルをいったん削除してアップロードしなおすと直るのですが、 ファイルのアップロードには時間がかかるため、 他にいい応急措置の方法がないものかと悩んでいます。 それから、そもそもこの規模のサイトでデータベースを運用するには SQLiteでは限界があるのでしょうか? 仮に他のデータベースに乗り換えるとしたら、 こうした頻繁に書き込み・更新・削除などが行われるサイトでは どのデータベースを利用すべきでしょうか? それともこの程度の規模であれば、 スクリプトを改善することでSQLiteでも対応可能なレベルでしょうか? なにぶんデータベースに触れて間もないもので知識不足ですが、 どなたか詳しい方にご教授いただければ幸いです。

  • 更新ロックとデッドロック

    データベースを勉強中の者です。ロックの種類についてどなたかご教示いただけますでしょうか。 ロックの種類は、次の三種類ですよね。 ・共有ロック ・排他ロック ・更新ロック 共有ロックの意味は理解できていると思うのですが、更新ロックがよくわかりません。 更新ロックにすると次のように動作するそうですね。 1.更新を前提にして共有ロックをかける。 2.更新する前に排他ロックに切り替わる。 排他ロックも更新時に使うロックですが、排他ロックと更新ロックの違いというか、使い分けがよくわかりません。 データを更新するためには排他ロックをかけないといけないのはわかりますが、その前に共有ロックをかける意味は? http://f29.aaa.livedoor.jp/~snaka/PukiWiki/PukiWiki.php?SQLServer%2F%A5%ED%A5%C3%A5%AF#na5d5d64 上のサイトを読んで「デッドロックを回避するため」といったんは理解したのですが、上司は「更新ロックとデッドロックは関係ない」と言います。 私の解釈が間違っているのでしょうか。それとも上司?

  • ファイルをロックするには

    現在Servletでファイルの書き込み、 または読み込みをするシステムを作ろうとしています。 同時に複数ユーザが同一ファイルにアクセスするのを 防ぐためにファイルをロックしたいと思っています。 Javaではファイルをロックするのに使うメソッドは ないと聞いたのですが、 実際にはどうしたら良いのでしょうか…。 できればサンプルのようなものがあると イメージが沸くので嬉しいのですが、 なければ「こうすれば実現できる」という方法だけでも ご存知でしたら教えていただけないでしょうか。 なお、syncronizedを使って ファイルアクセスするメソッドを排他にする方法は 使いたくありません。 ユーザAはファイル1、ファイル2、ファイル3を…。 ユーザBはファイル3、ファイル4、ファイル5を…、 といったように、一人のユーザも ほぼ同時に複数ファイルアクセスするので、 ロックしたいのは同じファイルだった場合のみ (しかもファイル名も動的に決まる) だからです。 もうしわけありません。 お力を貸していただけないでしょうか。 よろしくお願い致します。

    • ベストアンサー
    • Java
  • ファイルロックについて

    現在商品管理システムを自作してみようと頑張ってるところなのですが、ファイルロックで躓いてしまいました。flock()を使ってみたのですが同時に複数の処理(データの更新と書き込みを同時に行った場合等)が行われるとデータが消えてしまったりします。 皆様はどういった形でファイルロックをしてますか? これは安全だ! というようなロックってのはあるんでしょうか?

    • 締切済み
    • CGI
  • ASPプログラムにて、データベースファイルの更新ができません。

    参考本のサンプル集から取ったプログラム(名前と年齢の入ったデータベースに新たに追加するプログラム)なので、複雑なものではないのですが、プログラムをIEより実行すると、 ------------------------------------------------- エラー タイプ Microsoft OLE DB Provider for ODBC Drivers (0x80004005) [Microsoft][ODBC Microsoft Access Driver] データベースまたはオブジェクトは読み取り専用なので、更新できません。 /AddNew.asp, line 38 ------------------------------------------------- (ちなみに、line 38はUpdate構文です。) というエラーが出てしまいます。 mdbファイルのプロパティは「読み取り専用」にはなっておりません。フォルダ設定も同様です。 ホームディレクトリの設定でも「読み取り」「書き込み」の両方にチェックマークが入っています。 どなたか、解決方法を教えて下さい。

  • DB2の更新ロックについて

    DB2 v7を使用しています。 select文で更新ロックをかけました。 PreparedStatementとresultsetをcloseした後、同Connectionでupdate文をかけました。 このとき、select文のロックがかかってるのかわかりませんが、エラーも出ずに更新ができませんでした。 更新ロックのかけ方は 普通のselect文の最後に for updateとしただけです。updateは普通にupdateを行いました。 現在の状況としては、更新ロックがかかっているのかどうかわからないという状態です。 そこで、 (1)更新ロックがかかっているのかどうかを調べる方法があれば、その方法が知りたい。 (2)更新ロックの解除の方法をしりたい。 (3)select文で更新ロックをかけた場合の特別なupdateの方法が、その方法をしりたい。 どなたかご存知のかたがいらっしゃいましたらご教授くださいますようよろしくお願いいたします。 win2000 jdk1.3

  • select for updateのロック

    オラクルのselect for updateでロックをするタイミングがいつですか? こんなPL/SQLのコードがあったとします。 ---↓↓↓ソースコードここから↓↓↓------------------------- select * from テーブル1 where id = 1 for update; ・・・・・(a) ~ update テーブル1 set kingaku=100 where id = 1 ・・・・・(b) ~ commit; ---↑↑↑ソースコードここまで↑↑↑------------------------- id = 1のレコードがロックされるのは(a)、(b)どちらのタイミングですか? また、このロックは ・他トランザクションから読めるけど更新できない ・他トランザクションからは読むことすらできない のどちらでしょうか? よろしくお願いします。

  • 1テーブル&複数レコードの更新に対して1度のupdate文での処理方法

    1テーブル&複数レコードの更新に対して1度のupdate文での処理方法 Delphi2010+SQL SERVER 2005で開発しています。 update文で、 現在下のようにwhileで複数レコードに対して、 1回、1回、sqlを発行して、更新しています。 これを、一度のSQLの発行で処理できないものでしょうか? 更新テーブルは1つで、更新する項目も同じです。 更新するデータと、where句の条件が異なります。 もし可能なようでしたら、どうかご教授お願いします。 update table set A=1,B=2 where id=1 update table set A=2,B=3 where id=5 update table set A=9,B=99 where id=7 update table set A=5,B=10 where id=15 update table set A=1,B=10 where id=75

専門家に質問してみよう