みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
OSX+FMP(ver12 adv.)です。
初心者として分かりにくいのは、全置換を含むスクリプトを書く時の排他制御です。
あるまとまった数のレコードに全置換をする際に、全置換の開始から全てのレコードの
全置換が終わるまで、他のユーザーがそれらのレコードにアクセス出来ないようにしたいのです。
1個ずつのレコードのロック状態については、取得関数Get(レコードのオープン状態)
を使用すると理解しています。
たとえば100レコードの全置換をする際に、それらのレコードをロックする手段は
ないものでしょうか?または、たとえば80番目のレコードが他のユーザーにより
編集されている場合は、1番めのレコードの処理開始前に知ることができないでしょうか?
よろしくご教授願います。
完璧な方法は無理でしょう。
処理前に検知しても、処理を始めた後に他のユーザーがアクセスするかもしれません。
全置換やインポートなどのまとまったレコードを処理する場合に、排他処理は難しいので、ゲストの居ない深夜等の時刻を見計らって行うか、それが出来ない場合にはとりあえずやってみてエラーが出れば再施行(成功したレコードを除外していってもいいかも)、などしかないでしょうね。
または、他のユーザーがアクセス出来ない様にフラグを振っていく、という方法も有る事は有ります。ただ、このフラグも全置換等で設定していく事になりますので、やってみてエラーが無くなるまで繰り返し、その後本来の全置換を行って、フラグを全置換でリセット、という手順になりますので、誰かがアクセスしていれば、離してくれるまで待つ事になります。
Last edited by Shin (2014-01-12 16:21:10)
Offline
> レコードの全置換をする際に、それらのレコードをロックする手段はないものでしょうか?
ポータルを利用すれば、複数レコードにレコードロックを掛ける事が出来ます。
【引用】
sevensdoor(竹内氏)の[FMスーパーテクニック]〜トランザクションについても考えよう〜 http://web.sevensdoor.com/events_browse.xsl?report=36 より抜粋
ポータルを利用することによって「現在のレコード」からその先の関連レコード全てをロックすることができます。
これを利用すれば、レコードロック用のテーブルを作っておき、関連レコードをロックするなど、予め目的のレコードをすべてロック...すなわち「これから書き替えますよ」とつかんでしまう処理も実現できます。
Last edited by Hiro (2014-01-14 12:49:03)
Offline
完璧な方法は無理でしょう。
処理前に検知しても、処理を始めた後に他のユーザーがアクセスするかもしれません。
全置換やインポートなどのまとまったレコードを処理する場合に、排他処理は難しいので、ゲストの居ない深夜等の時刻を見計らって行うか、それが出来ない場合にはとりあえずやってみてエラーが出れば再施行(成功したレコードを除外していってもいいかも)、などしかないでしょうね。
または、他のユーザーがアクセス出来ない様にフラグを振っていく、という方法も有る事は有ります。ただ、このフラグも全置換等で設定していく事になりますので、やってみてエラーが無くなるまで繰り返し、その後本来の全置換を行って、フラグを全置換でリセット、という手順になりますので、誰かがアクセスしていれば、離してくれるまで待つ事になります。
Shin様ありがとうございます。まずは、そう簡単なものではないと分かっただけでも、一歩前進です。
今の所、全置換するようなレコードにアクセスするユーザーが少ないのに助けられて、深夜に処理しなくてもよい状況になっていますが、「全置換処理」を含むスクリプトを記載する時には常に、排他処理には留意していこうと思っています。
> レコードの全置換をする際に、それらのレコードをロックする手段はないものでしょうか?
ポータルを利用すれば、複数レコードにレコードロックを掛ける事が出来ます。
これは私が希望していた解に、かなり近いものですが、記事を読むと、なかなか難しいですね。「全置換処理を含むスクリプト」を記載する場合、皆さんの多くがこのテクニックを使っているとは思えないのですが・・・。ともかく勉強しがいのあるテクニックですね。これで「解決」としたいところですが、もし、他の皆様で、「全置換処理を含むスクリプトの記載」で何か注意していることとか、他のテクニックなど使われている方がおられましたら、ご紹介いただければ幸いです。
Hiro様
ありがとうございました。おかげさまで、先日教えていただいた、「ポータルを利用して複数レコードにロックをかける」がマスターできました。理屈がわかったので、自分のソリューションにも応用できそうです。感謝いたします。
ODBCでロックできるけど、FMの「SQLを実行」がトランザクション維持できなかったと思うので、1回の実行で全部やらないといけないか。
ODBC共有にして、SQLを実行「UPDATE ~~~」でやると、別途ロックする必要はなくて、失敗した場合のロールバック?まで一括した処理になります。
Get(最終エラー)とGet(ODBCエラー)で結果を見て、駄目だったら再試行とか。
「SELECT ~~ FOR UPDATE」でロック状態の確認だけもできるけど、「後に他のユーザーがアクセスするかもしれません」ので、あんまり意味ない。
WHEREにBETWEENを使うと異常に遅くなる...
FMPではODBCがローカル接続しかできないので、どうかな。
全置換ではなくフィールド設定のLoopじゃダメなのかな。
エラー処理オンでLoop処理時にエラーが出たレコードはIDとかを変数に格納して
次回(数分後?)はエラーレコードだけを再試行するとか。
内容によるでしょうね。
一部だけ置換された状態になるので、それでいいかどうか。
SQLExecuterさん
Travellerさん
ありがとうございました。
なかなか難しいですね。そもそも、同一レコードに多数のユーザーがアクセスしないように、テーブルを分けたり、フィールドを分けたりするような知恵も出てきました。
なるべく、困った状況になる「確率を下げる」のも、開発者に必要なスキルですね。でも、確率を下げたいばかりに手間が増えるのも問題だし、そのような部分の意思決定も
面白いと思いながら、開発することにします。
Pages: 1
[ Generated in 0.004 seconds, 7 queries executed - Memory usage: 542.91 KiB (Peak: 563.82 KiB) ]