CGI-BBS > CGI > Perl > ファイル書き込み、読み出し時の留意点


カレッヂ
カレッヂ


質問者 よしゅあ  投稿日 8/17(金) 16:04:03
ファイルへの書き込み、読み出しを行うときにファイルロックを必要とする場合があると思うんですが
たとえば、「同じファイルに対して違うプロセスが同時に書き込むと、データが破損する」とか。
ほかに、気をつけることがありますでしょうか。ありましたらぜひご教授ください。
(ファイルの読み出しについては、まったく気をつけなくてもよいのでしょうか・・?)
回答者 まさ  [削除]  投稿日 8/20(月) 10:01:31
>たとえば、「同じファイルに対して違うプロセスが同時に書き込むと、データが破損する」
>とか。
>ほかに、気をつけることがありますでしょうか。
>ありましたらぜひご教授ください。

いやこれに尽きると思いますけど。
このデータ破壊を完全に防げば、ロックは成功です。

ただ、一口にロックと言ってもそのアルゴリズムは実に様々なものがあります。例えばflock
を使うもの、symlink、mkdirなどを使うもの。巷に出回っているものには間違いもあるよう
です。アルゴリズムを正確に理解し、間違ったものを書かないというのが一番大事なのでは
ないでしょうか?

flockに関してのみ参考に書いておきます。
http://www2.kiwi-us.com/%7Ej_n/perl/flock.html

>(ファイルの読み出しについては、まったく気をつけなくてもよいのでしょうか・・?)

気をつけなくてよいです。
ロックするのはあくまで書き込む時だけです。

質問者 よしゅあ  [削除]  投稿日 8/20(月) 10:52:26
返信ありがとうございます。
読み出すときは気をつけなくていいんですね。ちょっとホッとしました。
今作成しているプログラムはsymlinkによるロックを行っていますが
もう一度振舞いを観察してしっかり動いているかどうか確かめてみます!
回答者 まさ  [削除]  投稿日 8/20(月) 16:45:41
ただ注意しないといけないのは、100%のロックはないと言う事です。
アルゴリズムが例え100%であってもファイルが壊れる可能性は0ではありません。
たとえばディスククラッシュなど別な理由でファイルが壊れるかもしれません。

とにかく正常なロックをかけておけば、ロックをかけていないときよりも、ファイルが壊れ
にくい程度に思っておいてください。

本当に重要なデータはバックアップデータとしてミラーしておく方が安全でしょう。

また誤解を招かないように、

>>(ファイルの読み出しについては、まったく気をつけなくてもよいのでしょうか・・?)

>気をつけなくてよいです。
>ロックするのはあくまで書き込む時だけです。

これはあくまで読み出し専用ファイルの場合です。
そのファイルに書き込みが発生する場合、たとえ読み出しの場合でもファイルをロックしない
といけません。どんなロックがいいのか? それは書き込みの時と同じロックでいいです。



質問者 よしゅあ  [削除]  投稿日 8/20(月) 16:58:40
たびたび返信ありがとうございます。
思いっきり勘違いしてました。読み出しの時もロックすべきなのですね。
僕が想定しているのは書き込みも読み出しもアリなファイルでした。
しかし、なぜ読み込みにもロックするべきなのでしょうか?
よろしかったらご教授ください。
回答者 まさ  [削除]  投稿日 8/20(月) 19:04:00
読み込んでいる最中に誰かがそのファイルを書き換えてしまうと、データの整合性が取れなく
なります。

ですが、実際にそこまでしているスクリプトは少ないと思います。
データの整合性が取れなくなっても、データが壊れるわけではないのでその部分は多めに見て
いるのでしょう。

わたしもBBS程度ならば、読み込みの時のロックはしません。

あくまでも厳密に言えばの話だと思っておいて下さい。
「読み書き属性のファイルは、そのファイルにアクセスする時は、ロックする」
しかし実際は
「読み書き属性のファイルは、そのファイルを書き込む時は、ロックする」
でいいと思います。

返信(回答)する


Web裏技