トップ回答者
SQLSERVER2005にてリンクサーバー先のテーブルに対してロックがかからない

質問
-
みなさんこんにちは。
現在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
--------------------------------------------------------------------
どなたかご存知の方いらっしゃいましたらご教授願います。
回答
-
自己解決しました。
リンクサーバー越しには「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 条件・・・
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
以上 一応自己解決ですが、何か突っ込みなどございましたらお願いいたします。
すべての返信
-
自己解決しました。
リンクサーバー越しには「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 条件・・・
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
以上 一応自己解決ですが、何か突っ込みなどございましたらお願いいたします。