CGI-BBS > CGI > Perl > ロックに関して、ホントに同時に書き込み処理する可能性って


カレッヂ
カレッヂ


質問者 やまあらし  投稿日 5/10(金) 03:09:14
夜な夜な出没中ですが、そろそろ掲示板の私物化と言われそうで怖いですが
作りたい物がだんだんと完成してきました。後はロック処理をどういう方法で
行うのが効率的か教えていただきたいのですが、

ロック処理そのものは理解しています。
data.datのデーターをきちんと確保したいので
データーを開いて書き込むまで ずっとロック状態にしようと思っています。
symlinkを使ってやろうと思っています。

それで思うことが2つ
1つ目
ホントに全く同時にロック処理が行われる確立って何%位なのでしょうか?
細かく言うとどこからが同時扱いなのでしょうか?処理のタイミングが0.000001秒
の差でも同時にならないのならあまり気にしないし、0.5秒くらいならロックの意味ないし

サーバーの性能と利用者数の関係もあると思いますが、サーバーはごく最近のユニックス系
みたいです。
利用者数は約5,000件(行)分のCSVデーターの削除、登録、変更を約100人の人が
行います。
データーの変更する確立が1日に全体の2%の100件程度かと思います
不特定多数の利用ではないので、ロックさえかかれば楽ですからあまり重大には
思ってないですが、ほんとに同時になることってあるのでしょうか?

2つ目
こちらの方が重要な疑問ですが
上記との関連で、データーを開いて書き込むまで ずっとロック状態にするというのが

掲示板で言うと

Aさんがページにアクセス・・データー開く前にロック処理
Aさん掲示板観覧中
 Bさん掲示板にアクセス・・データーみれない
Aさん発言入力中
 Bさんまだみれない
Aさん自分の書き込み登録・・書き込み後ロック解除
 Bさんデーター見る事できる・・・ロック処理

と考えているのですが、中には気まぐれで

Aさんが自分の書き込み書いている途中で ブラウザ閉じたり
他のページへ移動した場合、要するに書き込み登録前に(ロック解除前)
移動、切断した場合ずっとロック状態のままになってしまうのでしょうか?

もしそうなる場合

それをさけるために、
ファイル読み込み時ロック、配列変数に代入後、即ロック解除
ファイル書き込み時ロックして書き込んでロック解除

こっちの方が良いのでしょうか 

どこで処理させるかの疑問ですが皆様のご意見お聴かせ下さい。
よろしくお願いします。



回答者 しあわせのツボ  [削除]  投稿日 5/10(金) 13:26:17
「同時」をどう解釈するかによりますが…

ファイルから見た「同時」であれば、CGI側の実装に依存します。
読み込み開始から書き込み終了まで他者からの変更があっては困る設計なら、「同時」に処理が発生する率は高くなりますし、逆に書き込み時の一瞬だけ必要なら、処理がぶつかる可能性は低くなります。

システムから見た「同時」だとまた別の話になります。
たとえばsymlinkを利用したロックの場合、処理Aがファイルの確認を要求>システムがファイルの不存在を通知>処理Aがsymlinkを要求>システムがsymlinkを完了、までの間に処理Bにもファイルの不存在が通知されてしまう可能性を「同時」と呼ぶことになるでしょう。
ハードディスクの読み書きには通常30msはかかりますから、これを信じるなら処理完了まで0.07秒くらいはある計算になります。いきなりsymlinkを要求し、その成功/失敗で判断するロジックにすれば、その半分にできますね。

ちなみに経験上、何のロックもせず読み込んで配列処理をし書き戻す場合、1日200処理で月1回程度破綻します(苦笑)。


基本的には間違った理解はしていないようなので大丈夫だと思います。
見るだけならロックに関係なく見られるようにするとか、一定時間を過ぎたロックは強制的に解除するとか、実装で何とかする方法はあるので、頑張ってみてください。

こないだの郵貯システム障害も、排他処理がうまくいかなかったのが原因でした。
難しいものですし、完璧ではないので、毎日バックアップをとるのが最も安全です。

返信(回答)する


Web裏技