サーバーサイドは事情で触れないが、クライアント複数拠点から、サーバーにソケット接続したとき、先に接続したソケットが確実に終了するまで後の接続が待機出来ればいいんでづよね。
通常方式>>
サーバー側にソケット接続要求あったらスレッド立てて当該接続専用の処理を実行して、その間は別の接続要求を受け付ける。受信専用スレッドと要求処理用スレッド2つで接続要求を管理する。
サーバーサイドが事情で触れないならば方式>>
クライアントのマルチ接続を排他制御とするためには、
1.複数拠点間でセマフォをつかう。
セマフォは、データベースなどで、レコード作成、物理削除される迄の間、他方のクライアントは接続要求を保留する。select for update でロック用レコードをロックしてからinsert します。ロック出来たクライアントは
処理中レコードinsert
ソケット通信実行
ソケット完了後、処理中レコードを削除
select for update でロックしたレコードを適当に更新
commit して完了
今接続処理中かもしれない他方のクライアントの接続処理は、
ロック用レコードのselect
前回取得したロック用レコード内容と同一なら、処理中レコードのinsert
ロック用レコード内容が異なるなら内部に保持する。
処理中レコードのinsert
失敗時は、select して画面にクライアントAが処理中です、とかエラーメッセージを出す。
データベースのロックが、つまり、select for update 初めてのクライアントはロック取得にせいこうし、次のクライアントのロック要求のとき、直ぐに失敗するならエラーメッセージを表示できるけど、ロック解除待ちでドライバーの中で待機されちゃうとクライアントの画面が固まってしまうのでこれは避けたい。
ロック用テーブルとレコード1個で大丈夫だと思うけど、本当に同時の要求の場合は、ーどうなるのかわからないので、ロック用と処理中用2つのテーブルとレコードで排他制御するってのはどうでしょうか。
ネットワークドライブとかで共通の参照書き込み先があるなら、ロック用ファイルを作成〜削除ってのもあります。
全クライアントに特定ポートを空けられるなら、常時起動してるクライアントを1台用意して、そのクライアントが排他制御用のホストになる、データベースなどの共通資源が無い場合やネットワークドライブなども使えない場合。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/10/16 02:32