SQL Server2000を使用し、
あるトランザクションで排他ロック(XLOCK)をかけたレコードが
他のトランザクションから共有ロックを使用し参照できてしまう状態は存在するのでしょうか?
排他ロックをかけたレコードが
他のトランザクションから参照できてしまい困っています。
現在、下記の環境で開発を行っております。
・サーバ側
Windows Server2003
SQL Server2000(sp4)
・クライアント側
Windows Xp(sp3)
jdk6.0
jdbc 3.0 Type4
以下が具体的な状況となります。
前提として、
・二つのトランザクション(以下A、Bと表記します)が存在する。
・AとBは別のユーザでコネクションを張っている。
・autoCommitはfalseに設定している。
・テーブルにプライマリキーやインデックスは張っていない。
・レコードは10件。
・分離レベルはREAD COMMITED
(1)Aから、「SELECT * FROM TEST_TABLE WITH(XLOCK) 」を発行
(2)Bから、「SELECT * FROM TEST_TABLE」を発行
このような状況で、(1)、(2)の順で処理を行った場合に
私の認識では、(2)の検索時にタイムアウト等が発生するという認識です。
しかし、(2)のSQLは正常に終了し、(1)と同じデータが取得されてしまいます。
◆その他、確認したこと
・(1)の処理直後に処理を停止し、Enterprise Managerでロックが取得されているか確認したところ、トランザクションAがすべてのレコードを排他ロック(X)していた。
・(2)の処理直後にロックの状態を確認しても、やはりトランザクションAが、排他ロック(X)していた。
・CSEを使いODBC経由で同様の操作を行った場合も同じ動作がおこる。
・(1)WITH(XLOCK, TABLOCK)とすると(2)でデータが取得できなくなる。
・(2)のSQLを「SELECT * FROM TEST_TABLE WHERE COLUMN01 > 0」のように指定するとタイムアウトする(期待通りの動き)
・(2)のSQLを「SELECT COLUMN01 FROM TEST_TABLE WHERE COLUMN01 > 0」のように指定すると、今度は、なぜか取得出来てしまう。
・(1)と(2)の間にトランザクションAでUPDATEなどを行うと(COMMITはしない)(2)のSQLのWHERE句や取得するカラムに関係なく、(2)のSQLはタイムアウトする(当り前か。。。)
いろいろ書きましたが、排他ロックされたレコードに
共有ロックはかけれないという認識なのですが、
そうではないのでしょうか?
また、そうではない場合どういった場合に、
共有ロックが可能となるのでしょうか?
SQL Serverの排他制御に詳しい方や
同じような現象に陥った方がいましたら、ご教授お願いします。
No.1ベストアンサー
- 回答日時:
私はロックヒントを殆ど使わないのですが、実際主キーのないテーブルで試してみるとそうなります。
プロファイラで見ても、ロックヒントのないSELECTがテーブルに対するインテント共有ロック以外取得していないように見えます
(ちなみにREPEATABLE READでは行共有ロックを取得し、SERIALIZABLEではテーブル共有ロックを取得しますし、主キーのあるテーブルではキーレベルの共有ロックを取得しいくのでXLOCKでブロックできます)。
MSDNのどこにもそのような記述はないので、いろいろ探した結果、あるMSDNのブログで1つだけそれらしい記述のあるものを見つけました。
> SQL Server avoids acquiring read committed locks when it knows that no data has changed on a page.
http://blogs.msdn.com/craigfr/archive/2007/04/25 …
この理解が正しいとすれば、「ユーザデータベースでは変更のマークのないページには共有ロックはかけない」となり、XLOCKだけではREAD COMMITTEDのSELECTは阻止できませんから、SERIALIZABLEで排他することが必要になります。
(つまりXLOCK,HOLDLOCK、または、TABLOCKXということになります)
ご回答ありがとうございます。
やはり、MSDNの記述は見つかりませんよね。
MSDNに明確にかかれているのが理想なのですが。。。
恥ずかしながら、MSDNブログの存在を初めて知りました。
URLのブログエントリー読ませていただきましたが、
まさに、現状で起こっていることを物語っているように思えます。
jamshid6さんの回答にある通り、XLOCK,HOLDLOCK、または、TABLOCKXを検討することになりそうです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
- Oracle sqlで質問です。 aテーブルとbテーブルがあり、下記のsqlで取得したidとnameに一致しないレ 1 2022/04/20 20:34
- Access(アクセス) アクセス 有効なフィールド名、または式として認識できませんのエラー 3 2022/08/19 11:53
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- MySQL 書籍の内容はまともでしょうか? 1 2023/01/22 03:07
- Oracle 下記のsqlで取得されるレコード以外を取得する方法ありますでしょうか。 SELECT B.番号, B 2 2022/04/20 23:21
- その他(データベース) 更新クエリをリンクデータベーステーブルに実行し実行時エラー3362固有インデックスに重複する値が含ま 1 2022/09/21 11:44
- Oracle 質問です。 下記のテーブルとデータがあり、 取得想定結果のように出力したいです。 下記のsqlだと0 2 2023/05/23 19:10
- MySQL PhpMyAdminで作成して実行せよ。 東京23区を、皇居を中心とした4つのエリア(南東, 南西, 1 2023/06/11 11:58
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SELECT文でのデッドロックに対...
-
SELECT文でタイムアウト...
-
Oracleの排他制御について教え...
-
INSERTにおいてロック処理は必要か
-
UPDATE文で発生するデッドロッ...
-
ExcelからAccess2013DBを更新す...
-
DB2のロック調査
-
楽観ロックって何?
-
同時書き込み
-
SQLServer Insertが遅い
-
ADOで排他ロックがうまくいかない
-
DB2の更新ロックについて
-
accessのロック
-
max+1で初番する場合 for updat...
-
AccessShareLock はどの程度気...
-
DB2でSelectした時(rollback,c...
-
トランザクション中にSELECTし...
-
「マスタ」と「テーブル」の違...
-
ACCESS2007 フォーム 「バリア...
-
クエリのキャンセルがいつにな...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SELECT時の行ロックの必要性に...
-
SELECT文でのデッドロックに対...
-
accessのロック
-
Oracleの排他制御について教え...
-
AccessShareLock はどの程度気...
-
SQLServer Insertが遅い
-
INSERTにおいてロック処理は必要か
-
DB2のロック調査
-
DB2でSelectした時(rollback,c...
-
ExcelからAccess2013DBを更新す...
-
トランザクションとlast_insert_id
-
SELECT FOR UPDATE にトランザ...
-
SELECT文でタイムアウト...
-
トランザクション中にSELECTし...
-
UPDATE文で発生するデッドロッ...
-
MongoDBのデータ更新はDBを排他...
-
書き込みの衝突
-
更新ロックとデッドロック
-
デッドロックが発生します。
-
同時書き込み
おすすめ情報