• 締切済み

ロックファイルの必要性

あるデータを登録したり検索したりするプログラムを作ってます。 データの登録は決まった人しかやらないので、 ファイルへのデータの書き込みもその人だけです。 検索は複数の人がするので、ファイルの読み込みは頻繁にあります。 この場合ファイルの書き込みの時に、ロックファイルは必要でしょうか? ファイルに書き込んでいるときに、 他の人が読み込みだけ行ってもファイルの破損はあるのでしょうか?

  • CGI
  • 回答数1
  • ありがとう数2

みんなの回答

  • Spur
  • ベストアンサー率25% (453/1783)
回答No.1

絶対に、同時1人しかアクセスしないなら、必要ありません。 でも、世の中に絶対はあり得ないので、普通ではあり得なくても排他制御した方が良いでしょう。 また、排他制御をするのは、ファイルの破損もあり得ますが、それよりパラドックスの防止じゃないですか? Aさんが、読み出して編集している。 少し遅れてBさんが読み出して編集をした。 Aさんが終わって、書き込みをした。 Bさんも終わって書き込みをした。 この時、BさんはAさんが書き込む前のデータを読み出して追記したので、Aさんが書き込んだものが、Bさんが上書きしたことで無視されてしまう。 それを防止したいんですよね?

harisun
質問者

お礼

ご回答ありがとうございます。 もちろん、念を入れるに越したことはないですが、 理屈では必要ないという事ですね。

関連するQ&A

  • ファイルロックについて

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

    • 締切済み
    • CGI
  • file()を使う時のファイルロック

    たいていの場合は問題ないのですが、 アクセスカウンタ等の更新の激しい物の場合、 file()やfile_get_contents()でファイルを開き、 その内容を元にfopen()・flock()・fputs()等を使って書き込むと、 データが破損してしまう事があります。 これはロック中でもfile()等では開けてしまうのが原因だと思いますが、 file()等を使う際の排他処理はどのようにしたら良いのでしょうか。 ロック中は、fopen()の前で解放されるのを待つ仕様なようなので、 $fp=fopen("ロック用ファイル","r"); flock($fp,LOCK_EX); ~複数のファイルの読み書きを含めた、様々な処理~ fclose($fp); としてみたのですが、これで排他処理は完璧になるでしょうか? これまでは、 1. ロック用ファイルが存在する場合、なくなるまでsleep() 2. 空のロック用ファイルを作成 ~複数のファイルの読み書きを含めた、様々な処理~ 3. ロック用ファイルを削除 としていたのですが、これでは度々破損してしまいました。 「1」と「2」の間で、新しいプロセスが「1」に割り込んで来てしまうせいでしょうか。 そうだとすれば、fopen()とflock()の間でも 同じ事が起きてしまう気がするのですが、どうなんでしょうか。

    • 締切済み
    • PHP
  • ロックファイルが消える

    ファイルロックにflockを使っているのですが、複数のファイルを扱うので、データファイルにロックをかけるのではなく別途「ロックファイル」に対してロックをかけています。 データファイルであれば読み書きモードで開く必要がありますが、ロックファイルは中身はどうでも良いので、 open(LOCK,"> $lockfile") or die ~ というように上書きモードで開いて良いとする解説を読んだので、そのようにしています。 しかし、ごくたまにロックファイルが消えてしまう現象が発生します(なかなか再現できずに条件など特定できず)。 あくまでもファイルの中身が壊れるとかいうことではなくて、ファイルそのものが消えます。 そこでお聞きしたいのですが、 1. ロックをかけたファイルが何らかの原因で消えた場合、ロック状態も消失してしまう(他プロセスがロックできてしまう)のでしょうか? 試してみたのですが、  まずプロセスAがロックをかけて  プロセスBが同ファイルにロックをかけようとすると、失敗する  プロセスAがロック解除せずにファイルを削除する  それでもプロセスBはロックに失敗する  プロセスAが(もう存在しないファイルの)ロックを解除(close)する  するとプロセスBはロックに成功する ということは分かったのですが、上記を、プロセスAがファイルを削除した後にプロセスBを動かすと、どういうわけかロックに成功してしまいます。 2. 複数プロセスが同時に上書きモードでopenしようとするのが消える原因なら、ロックファイルであってもやはり読み書きモードで開くべきなのでしょうか。そしてそれなら消えることは無いのでしょうか。 (読み込みモードではロックできないという解説もありました。) 御教授のほどよろしくお願いいたします。

  • ファイルのロックについて

    遠くにあるファイルサーバにあるExcelファイルへアクセスして編集を行っている最中に 回線落ちした場合Excelはロックされたままになってしまうのでしょうか?(再度開こうとした場合、他の人が読んでいる状態) もし、ロックされた状態になった場合どうすれば再度書き込みが出来る状態に出来るのでしょうか?

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

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

    • ベストアンサー
    • Java
  • 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を使う方法に変えようかとも思うのですが、どうなんでしょうか? なんか 基礎的なことが分かっていないので 分かりにくい質問になりましたが ファイルが壊れないような処理方法を作っていきたいので、ご教授のほど よろしくお願いします。

  • ロック??

    データファイルとかは同時書き込みされると破損するみたいですね。 それを防ぐにはとうすりゃいんだ?と思い書籍(十日でおぼえるPerl講座)をみるとFlock関数を使えばいいとありました。 しかし自分が使っているスクリプトのロック関数は MkdirとSymlinkだけです。 これはどうすればいいんでしょうか?

  • ファイルロックの確認

    PHPで掲示板を作っています。バージョンは5? (php.exeファイルのバージョンは5.2.1.1です。) ファイルロックについて、下記2点を教えてください。 同時書き込みによるログファイルの破損を防ぐため、ロック専用ファイルによるロックとアンロックの仕組みを作りました。 正常に稼動しているか、以下の方法でチェックしました。 1.ブラウザを2つ開く 2.両方とも書き込みボタンを押すだけの状態にする 3.両方のブラウザ(フォーム)の「書き込み」ボタンをすばやく続けてクリックする この方法だと、3で2個のボタンをクリックする間のタイムラグがあり、“同時”書き込みは難しいように思います。 他に方法があるのでしょうか? ////////// ロックファイル:lock/lock.php(755) --<?php --$lockfile = '.lock/lock.txt'; --$fp = fopen($lockfile,"w"); --flock($fp,LOCK_EX); --?> アンロックファイル:lock/unlock.php(755) --<?php --fclose($fp); --?> ロック用ファイル:lock.txt(644) ロックディレクトリ:lock(755) 動作ファイル:bbs.php --<?php --require_once './lock/lock.php'; --掲示板の処理 --require_once './lock/unlock.php'; --?> ロックのファイルを別ディレクトリに置くことは可能でしょうか? 可能であれば、パーミッションはどのようにすればいいのでしょうか? 現状、前述の方法でログが破損するかチェックしても異常ありません。 また、ロック関連の記述を削除してチェックしても異常ありませんので、ロックが正常に稼動しているのかどうか確認できない状態です。 PHPは始めたばかりですので、おかしなことを言っている箇所もあるかもしれませんが、宜しくお願いします。

    • ベストアンサー
    • PHP
  • ファイルロックのかけ方

    今、PerlでCGIを作っているのですが 友達にデータファイルをロックした方がいいよ。 って言われました。 その友達もロックの仕方は知らないみたいですので 何か良い方法があったら教えてください。 それと、ロックというのは 読み込むときと書き込むとき両方必要なのかも教えてください。 宜しくお願いします。

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

    C言語初心者です。OSはHP-UXを使っています。 AプログラムXXXファイルに書込みます。 しかし、BプログラムではXXXファイルを読込みます。 Aのプログラムが書込んでいる最中、Bは読込ませたくありません。 lockfにてAプログラムでXXXファイルをロックしているのですが BプログラムではXXXファイルを読む事ができます。 なぜでしょうか? BプログラムでもXXXファイルをlockfする必要がありますか? よろしくお願いします。

専門家に質問してみよう