none
SQLSERVER2005にてリンクサーバー先のテーブルに対してロックがかからない RRS feed

  • 質問

  • みなさんこんにちは。

    現在SQLサーバーを2本立ててお互いにリンクサーバーでリンク付けしたシステムを担当しております。
    そこで更新ロックをリンクサーバ先のテーブルにかけるためSQLを発行しましたが
    エラーも発生せずロックがかかっていないという状況が発生しました。
    なぜロックがかからないのでしょうか?
    リンクサーバー越しにはロックはかからないものなのでしょうか?

    詳細状況
    ----------------------------------------------------------------------------------
    1:(2台のサーバをそれぞれサーバA、サーバBとすると)
      サーバAにログインする(ManagementStudioにて実行)
    2:トランザクションを発行する
    3:サーバAのテーブルCに対しロックをかける →OK
    4:サーバBのテーブルCに対しロックをかける →NG
    ※テーブルCはサーバA・B共に存在します。
    ----------------------------------------------------------------------------------

    ロジック的には
    ----------------------------------------------------------------------------------
    Begin Transaction
        SELECT  項目A FROM テーブルC WITH(UPDLOCK,ROWLOCK) WHERE 条件・・・
        SELECT  項目A FROM [サーバーB].[カタログ].[スキーマ].テーブルC WITH(UPDLOCK,ROWLOCK) WHERE 条件・・・
    ----------------------------------------------------------------------------------


    環境 
    --------------------------------------------------------------------
    ・サーバ WINDOWS2003SERVER (2台とも)
    ・ DB  SQLSERVER2005 SP2 (2台とも)
    クライアント WINDOWS XPSP2
    --------------------------------------------------------------------

    どなたかご存知の方いらっしゃいましたらご教授願います。

    2008年5月19日 9:56

回答

  • 自己解決しました。

    リンクサーバー越しには「
    Set LOCK_TIMEOUT 0」は効かないので
    ロックのヒントで「NOWAIT」を指定するとタイムアウトが効きました

    結果としてはこんな感じでいけました
    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    Begin
    DISTRIBUTED Transaction
        SELECT  項目A FROM テーブルC WITH(UPDLOCK,ROWLOCK,
    NOWAIT) WHERE 条件・・・
        SELECT  項目A FROM [サーバーB].[カタログ].[スキーマ].テーブルC WITH(UPDLOCK,ROWLOCK,
    NOWAIT) WHERE 条件・・・
    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------


    だめだった元スクリプトは
    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    Begin Transaction
        SELECT  項目A FROM テーブルC WITH(UPDLOCK,ROWLOCK) WHERE 条件・・・
        SELECT  項目A FROM [サーバーB].[カタログ].[スキーマ].テーブルC WITH(UPDLOCK,ROWLOCK) WHERE 条件・・・

    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    以上 一応自己解決ですが、何か突っ込みなどございましたらお願いいたします。
    2008年5月21日 10:10

すべての返信

  • 自己レスです。

    リンクサーバー越しにロックをかける場合には
    Begin Transaction  ではなく Begin DISTRIBUTED Transaction でかけるとロックがかかることがわかりました。
    しかしその場合 Set LOCK_TIMEOUT 0 で指定するようなロックのタイムアウトがきかなくなります。
    リンクサーバでもロックがかかり、他のセッションにロックがかけられている場合は待たずにエラーを返す方法を
    どなたかご存じないでしょうか?

    2008年5月20日 5:34
  • 自己解決しました。

    リンクサーバー越しには「
    Set LOCK_TIMEOUT 0」は効かないので
    ロックのヒントで「NOWAIT」を指定するとタイムアウトが効きました

    結果としてはこんな感じでいけました
    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    Begin
    DISTRIBUTED Transaction
        SELECT  項目A FROM テーブルC WITH(UPDLOCK,ROWLOCK,
    NOWAIT) WHERE 条件・・・
        SELECT  項目A FROM [サーバーB].[カタログ].[スキーマ].テーブルC WITH(UPDLOCK,ROWLOCK,
    NOWAIT) WHERE 条件・・・
    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------


    だめだった元スクリプトは
    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    Begin Transaction
        SELECT  項目A FROM テーブルC WITH(UPDLOCK,ROWLOCK) WHERE 条件・・・
        SELECT  項目A FROM [サーバーB].[カタログ].[スキーマ].テーブルC WITH(UPDLOCK,ROWLOCK) WHERE 条件・・・

    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    以上 一応自己解決ですが、何か突っ込みなどございましたらお願いいたします。
    2008年5月21日 10:10