XPA4.8 SQLserverでの排他制御について
XPA4.8、SQLSERVERにて排他制御の確認を取っているのですが
以前、このフォーラムで拝見したMgLock.datを使用したレコードロックを試しておりました。
EDPでは想定した通り、レコードがロックされメッセージが表示されるのですが、
ECFで実行するとレコードロックが発生せずに後書きが優先されてしまいます。
なにかECFにした際に設定しなければいけないものがあるのでしょうか?
ご教示お願い致します。
-
SQL_PHYSICAL_LOCKING
MS-SQL Serverでは、Magic xpaのデフォルトとして行レベルの物理ロックがサポートされています。論理ロックを使用するには、[データベース特性]の[データベース情報]特性で次のフラグを追加します。
SQL_PHYSICAL_LOCKING=N
このフラグが「Y」に設定されている場合、またはフラグがまったく設定されていない場合、次のように、FROM句内のUPDLOCKヒントが送信されます。
SELECT a,b
FROM tab1 (UPDLOCK NOWAIT)
ORDER BY a
このフラグが「N」に設定されている場合は、ロック動作は論理ロックになります。とヘルプに記載されています。
フラグがまったく設定されていないので本来ヘルプ通りのロックになると思うのです。
しかしロックがかかりません。本来SQLの構文ですと
SELECT a,b
FROM tab1 WITH(UPDLOCK,ROWLOCK,NOWAIT)
ORDER BY a
となるべきなのではないでしょうか?
SQLの発行正しくされているのでしょうか?
どのように検証すればよいかご教示ください。 -
加藤聡さん、
mglock.datはどこに置いても構わないでのすが、各クライアントからは物理的にこのファイルを共有している必要があります。それぞれのクライアントが勝手なローカルのパスを指定していると、排他はまったく効かなくなりますよ。
mglock.datのパスは、動作環境で設定することができます。
-
パスは設定して同じファイルを見るようにしましたが駄目でした。
追記ですが、ラインモードでの入力時はロックがかかりますが
スクリーンモードの場合がロックかからずに後書きになります。
-
加藤聡さん、
データベース特性の「Magicロック」の設定を見直すといいですよ。
-
tanda様
データベース特性の「Magicロック」の設定を上記で記載しておりますが
SQL_PHYSICAL_LOCKING
であればどちらもすでに試しており、Y,Nどちらもダメでしたので
記載しております。
他の見直すポイントがあるのでしょうか?
-
加藤聡さん、
「Magicロック」の設定はここ↓ですよ。ここの設定はどうなっていますか?

-
加藤聡様
そのスクリーンモードのタスクのトランザクションモードは、何になってますか? -
tanda様
magicロックはレコードにしてあります。
nkmt様
物理または親と同一(親でも物理)を指定して試していますが
スクリーンモードの場合だけロックされません。
トランザクション開始もグループ以外は試しておりますが駄目でした。
グループでキー項目を指定しないといけないのでしょうか?
-
(良し悪しあるとは思いますが、私は)
トランザクションモード P=物理
トランザクション開始 L=レコードロック時
ロック方式 O=入力時
をオンラインタスクでは使っています。
データベース設定では以下にしております。
-
加藤聡さん、
「mglock.dat」のパス指定は、下図の場所です。デフォルトはカレントパスになっていますが、ここのパス指定が、全クライアントから見て、物理的に同じファイルを指している必要があります。デフォルトのままだと、各クライアントは自分自身のローカルにファイルを作ってしまいます。

-
mglock.dat は客先実行版など
INIファイル上
LockFile = mglock.dat という記述ですが
サーバー+PC複数台の環境等でもecfが置いてある場所に
mglock.datが出現します。
ecf1個所の複数台環境で、ローカルにmglock.datが作られる事は体験した事がありません。
※誤認識があるかもしれません。その際はすみません。 -
加藤聡さん、
mglock.datのパス指定は、環境がLAN上にある場合は、「コンピュータ名 + そのマシンのパス」でいいのですが、東京本社と大阪支店とかのように遠く離れていて、DBが東京にあり、Magicクライアント実行版が大阪で動いているような場合は、「IPアドレス + 共有フォルダのパス」で指定してやると分かりやすいですよ。
-
tanda様
nkmt様
ご連絡ありがとうございます。
トランザクションモード P=物理
トランザクション開始 L=レコードロック時
も試しtのですがスクリーンモードだとかかりません。ロックファイルもパス設定しています。
このためにラインモードではロックがかかっていると思っておりますが
間違っておりますでしょうか?
-
トランザクションモード P=物理
トランザクション開始 L=レコードロック時
ロック方式 O=入力時
これだと複数端末で、同時に同じマスタメンテナンスは開きますが、
片方が修正入力をしたら、
他の人が同じレコードを修正入力をした段階で、
レコードロック解除待ちになる、と思ってます。 -
nkmt様
こちらでテストしている限りですが、ラインモードはレコードロック解除待ちになるので
想定している動きですが、スクリーンモードではロックがかからず後書き優先です。
nkmt様からの情報でSQLのデータベース情報を追加し現在テストしております。
少し動きが変わりましたのでご報告まで
check_key=Y を追加後 最初に変更したユーザー側で更新しようとしてもエラーが発生しないが
画面が遷移しない。
後書き側が画面を閉じると先に更新している側の画面が閉じられる
という状態になっております
-
加藤聡さん、
補足説明ですが、mglock.datを使用するという設定にした場合、Magic独自の排他制御が有効になりますので、SQL Server側の排他は無視されます。mglock.datが優先されます。
したがって、SQL Server側の設定をあれこれ触ると、かえっておかしな動きになる可能性もありますよ。mglock.datを使用する場合は、すべてMagic任せにしたほうが無難です。
ただ、最近はSQL Serverの排他制御を使用するのが当たり前になってきましたので、遅延トランザクションでリアルタイムのロックを掛けたいというような状況でない限り、mglock.datを使用するメリットがなくなってきましたね。
-
tanda様
mglock.datを使用するという設定にした場合、Magic独自の排他制御が有効になるとのことであれば
スクリーンモード時にレコードロックがかからないというのはバグという認識でよろしいでしょうか?
デフォルトの設定に戻してもやはりスクリーンモード時は排他制御は後書きにしかなりません。
ロックはかからない状況です。
-
加藤聡さん、
バグではないと思います。
ちょっと、あとで時間ができたときに、マルチユーザの環境を作って試してみますね。
-
加藤聡さん、
時間ができたので試してみました。
下図の通り、正常にロックが掛かりました。
mglock.datも下図のように、正常に生成されています。
使用したMagicのバージョンは、Magic xpa 4.8.1 PT1です。もう一度、各環境をチェックされるといいと思いますよ。
-
tanda様
ご連絡ありがとうございます。

はどのようになっておりますか?
色々試しておりますが、レコードロックがいまだにかかりません
トランザクションの開始やロック方式を色々試しておりますがかからない状態です。
-
加藤様の担当者マスタメンテのタスクは、上位にタスクがありますか?
実験として、
今の担当者マスタメンテのタスクを親タスクにして
実験をされてみてはいかがでしょうか? -
加藤聡さん、
リアルタイムのレコードロックを実現したい場合は、下図のように、デフォルト設定のままにしておく必要がありますよ。

-
tanda様
ご連絡ありがとうございます。
検証してみます。
-
加藤聡さん、
ラインモードではうまく動いているとのことですので、どうやらタスク固有の問題のような気がしますね。
-
tanda様
ご教示くださった内容でもだめでした。
現在、親プログラムよりパラメータでスクリーンモードの子画面を表示し確認しております。
この辺りも含め再度検証してみます。
-
加藤聡さん、
障害切り分けの常套手段ですが、APGで作った程度の単純なプログラムでまず動作確認されるのがいいと思いますよ。
-
tanda様
いつも大変お世話になっております。
ご連絡ありがとうございます。
APGで作成したPGでも試しましたがロックはかからない状態でした。
環境回りなのでしょうか?
-
加藤聡さん、
確認なんですが、ラインモードのプログラムでレコードロックが掛かったときのスクリーンショットをアップしてみていただけますか?
-
加藤聡さん、
現物のアップが難しいようでしたら、APGで作った程度のラインモードプログラムのアップでいいですよ。「レコードロック解除待ちです」というメッセージが出ていることさえ確認できればいいです。
-
tanda様

とロックがかかりますが、

スクリーンモードはAPGで作成しレコードロックの部分を修正しても
レコードロックがかからない状況です
サインインしてコメントを残してください。
コメント
38件のコメント