メインコンテンツへスキップ

XPA4.8 SQLserverでの排他制御について

コメント

38件のコメント

  • 加藤聡

    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の発行正しくされているのでしょうか?
    どのように検証すればよいかご教示ください。

  • Tanda

    加藤聡さん、

    mglock.datはどこに置いても構わないでのすが、各クライアントからは物理的にこのファイルを共有している必要があります。それぞれのクライアントが勝手なローカルのパスを指定していると、排他はまったく効かなくなりますよ。

    mglock.datのパスは、動作環境で設定することができます。

  • 加藤聡

    パスは設定して同じファイルを見るようにしましたが駄目でした。

    追記ですが、ラインモードでの入力時はロックがかかりますが

    スクリーンモードの場合がロックかからずに後書きになります。

  • Tanda

    加藤聡さん、

    データベース特性の「Magicロック」の設定を見直すといいですよ。

  • 加藤聡

    tanda様

    データベース特性の「Magicロック」の設定を上記で記載しておりますが

    SQL_PHYSICAL_LOCKING

    であればどちらもすでに試しており、Y,Nどちらもダメでしたので

    記載しております。

    他の見直すポイントがあるのでしょうか?

  • Tanda

    加藤聡さん、

    「Magicロック」の設定はここ↓ですよ。ここの設定はどうなっていますか?

  • nkmt

    加藤聡様
    そのスクリーンモードのタスクのトランザクションモードは、何になってますか?

  • 加藤聡

    tanda様

    magicロックはレコードにしてあります。

    nkmt様

    物理または親と同一(親でも物理)を指定して試していますが

    スクリーンモードの場合だけロックされません。

    トランザクション開始もグループ以外は試しておりますが駄目でした。

    グループでキー項目を指定しないといけないのでしょうか?

     

     

     

  • nkmt

    (良し悪しあるとは思いますが、私は)
    トランザクションモード P=物理
    トランザクション開始  L=レコードロック時
    ロック方式       O=入力時
    をオンラインタスクでは使っています。

    データベース設定では以下にしております。


  • Tanda

    加藤聡さん、

    「mglock.dat」のパス指定は、下図の場所です。デフォルトはカレントパスになっていますが、ここのパス指定が、全クライアントから見て、物理的に同じファイルを指している必要があります。デフォルトのままだと、各クライアントは自分自身のローカルにファイルを作ってしまいます。

  • nkmt

    mglock.dat は客先実行版など
    INIファイル上
    LockFile  = mglock.dat という記述ですが
    サーバー+PC複数台の環境等でもecfが置いてある場所に
    mglock.datが出現します。
    ecf1個所の複数台環境で、ローカルにmglock.datが作られる事は体験した事がありません。
    ※誤認識があるかもしれません。その際はすみません。

  • Tanda

    加藤聡さん、

    mglock.datのパス指定は、環境がLAN上にある場合は、「コンピュータ名 + そのマシンのパス」でいいのですが、東京本社と大阪支店とかのように遠く離れていて、DBが東京にあり、Magicクライアント実行版が大阪で動いているような場合は、「IPアドレス + 共有フォルダのパス」で指定してやると分かりやすいですよ。

  • 加藤聡

    tanda様

    nkmt様

    ご連絡ありがとうございます。

    トランザクションモード P=物理
    トランザクション開始  L=レコードロック時
    も試しtのですがスクリーンモードだとかかりません。

    ロックファイルもパス設定しています。

    このためにラインモードではロックがかかっていると思っておりますが

    間違っておりますでしょうか?

  • nkmt

    トランザクションモード P=物理
    トランザクション開始  L=レコードロック時
    ロック方式       O=入力時
    これだと複数端末で、同時に同じマスタメンテナンスは開きますが、
    片方が修正入力をしたら、
    他の人が同じレコードを修正入力をした段階で、
    レコードロック解除待ちになる、と思ってます。

  • 加藤聡

    nkmt様

    こちらでテストしている限りですが、ラインモードはレコードロック解除待ちになるので

    想定している動きですが、スクリーンモードではロックがかからず後書き優先です。

    nkmt様からの情報でSQLのデータベース情報を追加し現在テストしております。

    少し動きが変わりましたのでご報告まで

     

    check_key=Y を追加後 最初に変更したユーザー側で更新しようとしてもエラーが発生しないが

    画面が遷移しない。

    後書き側が画面を閉じると先に更新している側の画面が閉じられる

     

    という状態になっております

     

  • Tanda

    加藤聡さん、

    補足説明ですが、mglock.datを使用するという設定にした場合、Magic独自の排他制御が有効になりますので、SQL Server側の排他は無視されます。mglock.datが優先されます。

    したがって、SQL Server側の設定をあれこれ触ると、かえっておかしな動きになる可能性もありますよ。mglock.datを使用する場合は、すべてMagic任せにしたほうが無難です。

    ただ、最近はSQL Serverの排他制御を使用するのが当たり前になってきましたので、遅延トランザクションでリアルタイムのロックを掛けたいというような状況でない限り、mglock.datを使用するメリットがなくなってきましたね。

  • 加藤聡

    tanda様

    mglock.datを使用するという設定にした場合、Magic独自の排他制御が有効になるとのことであれば

    スクリーンモード時にレコードロックがかからないというのはバグという認識でよろしいでしょうか?

    デフォルトの設定に戻してもやはりスクリーンモード時は排他制御は後書きにしかなりません。

    ロックはかからない状況です。

     

  • Tanda

    加藤聡さん、

    バグではないと思います。

    ちょっと、あとで時間ができたときに、マルチユーザの環境を作って試してみますね。

  • Tanda

    加藤聡さん、

    時間ができたので試してみました。
    下図の通り、正常にロックが掛かりました。


    mglock.datも下図のように、正常に生成されています。


    使用したMagicのバージョンは、Magic xpa 4.8.1 PT1です。

    もう一度、各環境をチェックされるといいと思いますよ。

     

  • 加藤聡

    tanda様

    ご連絡ありがとうございます。

    はどのようになっておりますか?

    色々試しておりますが、レコードロックがいまだにかかりません

    トランザクションの開始やロック方式を色々試しておりますがかからない状態です。

  • nkmt

    加藤様の担当者マスタメンテのタスクは、上位にタスクがありますか?
    実験として、
    今の担当者マスタメンテのタスクを親タスクにして
    実験をされてみてはいかがでしょうか?

  • Tanda

    加藤聡さん、

    リアルタイムのレコードロックを実現したい場合は、下図のように、デフォルト設定のままにしておく必要がありますよ。

  • 加藤聡

    tanda様

    ご連絡ありがとうございます。

    検証してみます。

  • Tanda

    加藤聡さん、

    ラインモードではうまく動いているとのことですので、どうやらタスク固有の問題のような気がしますね。

  • 加藤聡

    tanda様

    ご教示くださった内容でもだめでした。

    現在、親プログラムよりパラメータでスクリーンモードの子画面を表示し確認しております。

    この辺りも含め再度検証してみます。

     

  • Tanda

    加藤聡さん、

    障害切り分けの常套手段ですが、APGで作った程度の単純なプログラムでまず動作確認されるのがいいと思いますよ。

  • 加藤聡

    tanda様

    いつも大変お世話になっております。

    ご連絡ありがとうございます。

    APGで作成したPGでも試しましたがロックはかからない状態でした。

    環境回りなのでしょうか?

  • Tanda

    加藤聡さん、

    確認なんですが、ラインモードのプログラムでレコードロックが掛かったときのスクリーンショットをアップしてみていただけますか?

  • Tanda

    加藤聡さん、

    現物のアップが難しいようでしたら、APGで作った程度のラインモードプログラムのアップでいいですよ。「レコードロック解除待ちです」というメッセージが出ていることさえ確認できればいいです。

  • 加藤聡

    tanda様

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

    スクリーンモードはAPGで作成しレコードロックの部分を修正しても

    レコードロックがかからない状況です

     

     

サインインしてコメントを残してください。