いつも勉強させて頂いております。どうぞよろしくお願いします。
以下の環境で開発を行っています。
SQLServer2005
ASP.NET C#
.NETのソースで
1つのクラスに2つのクエリ(2つともSELECT←複数テーブルを結合している)を呼び出す処理を書いています。(トランザクション処理は付けていません)2クエリとも検索対象テーブルは60万件程度のデータを保持しています。検索条件によって処理速度は違うのですが、1ユーザが最も遅い検索条件で検索をしてもタイムアウトにはなりません。しかし、2ユーザが同じタイミングで検索(どのような条件でも)処理を行うと、タイムアウトを起こしてしまいます。まれにデッドロックも起こります。
SQLServerではSelectのたびにlockがかかるのでSQL文中に「WITH(NOLOCK)」を記述するように書かれているサイトを見つけたのですが、他ユーザからの更新もあり得るテーブルなので、他の方法を探しております。
トランザクション分離レベルは規定値です。
是非、どなたかご教授ください。よろしくお願いします。
No.1ベストアンサー
- 回答日時:
2ユーザともタイムアウトになるのですか?
タイムアウトがハードウェアのリソースやコネクションの競合などではなくて、テーブルロックにより発生しているという結論はどうやって導き出しましたか?
READ COMITTEDのロックヒントなしのSELECT同士でブロッキングやデッドロックが発生するパターンが思い当たらないので。
NOLOCKをつけたらタイムアウトしなくなるか試してみるのがいいと思います。
で、本当にロックが原因で、ダーティリードは避けたいとなると、参照処理ということを踏まえてスナップショット分離レベルを使うくらいかと思います。
この回答への補足
>2ユーザともタイムアウトになるのですか?
はい。ほぼ同じタイミング、かつ10秒程度、タイムアウトになります。
>タイムアウトがハードウェアのリソースやコネクションの競合などではなくて、テーブルロックにより発生しているという結論はどうやって導き出しましたか?
私もjamshid6さんと同じように、ブロッキングやデッドロックが発生するとは思っていなくて、前述したようにSELECTでlockがかかるというサイトを見た、と言うだけです。多数のユーザがアクセスするシステムのため、2ユーザの処理だけでリソースのせいとは考えにくく、安易にそのサイトを受け入れたと言うところです。
>NOLOCKをつけたらタイムアウトしなくなるか試してみるのがいいと思います。
そうですね、NOLOCKをつけて同じ現象が発生しなければ、ロックが原因だったと言え、対処法としてはスナップショット分離レベルに設定すればよいと言うことになりますね。
jamshid6さん、ありがとうございました。分離レベルでもちょっと分からないところがあるのですが、ロックが原因だと判明したら質問させていただきます。
No.2
- 回答日時:
デッドロックが原因であれば、
SELECTだけの方は
SET LOCK_TIMEOUT 10000 (ミリ秒)
等を利用して設定値を小さくしエラーにしてみたらどうですか?
逆にデッドロックが原因ではない場合は
設定値を大きくし、エラーが発生しないように待つ設定にしてみたら如何でしょうか?
経験上ですがSQLServerの場合ロックのエスカレーションのせいでいきなりデッドロックが発生する事があります。
エスカレーションのせいでテーブルロックにまで膨らんだりします。
(以前プレミアサポートに確認したら時はPKeyやindexを指定していればありえないと言っていましたが、発生してしまっていました。)
実行中にロックレベルやロックの状態を確認するとはっきりとするかもしれませんね。
※2008では設定でエスカレーションを外せるようにはなってるみたいですね。
更新を伴うSELECTだとしたら、処理の順番を統一しているか確認が必要かもしれません。
処理の入り口で同じテーブルにテーブルロックをかけるように命令すれば確実にデッドロックは発生しなくなると思います。
(必ず待ちが発生し処理を平行して行えなくなるデメリットは発生します。)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
ゆるやかでぃべーと タイムマシンを破壊すべきか。
これはディベートの論題だと仮定したうえでの回答お願いします。あなたは、その末にタイムマシンを壊してしまうのか、使い道を探すのかどうかを考えてもらいたいです。
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
SELECT文でのデッドロックに対しての対処方
SQL Server
-
SQLについて教えて下さい with(nolock)の意味は何でしょうか?
SQL Server
-
「タイプ初期化子が例外をスローしました」エラー何?
Visual Basic(VBA)
-
-
4
System.IO.Directory.GetFilesの順番
Visual Basic(VBA)
-
5
ORA-01013のエラーについて経験のある方お願いします。
Oracle
-
6
同じSELECT文同士でのデッドロックが発生
Oracle
-
7
同じSQL文で極端に検索が遅くなる時がある
MySQL
-
8
datetime型でNULL値を入れたい。
SQL Server
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SELECT時の行ロックの必要性に...
-
max+1で初番する場合 for updat...
-
SELECT文でのデッドロックに対...
-
accessのロック
-
UPDATE文で発生するデッドロッ...
-
トランザクション中にSELECTし...
-
SELECT FOR UPDATE にトランザ...
-
AccessShareLock はどの程度気...
-
SQLServer Insertが遅い
-
INSERTにおいてロック処理は必要か
-
デッドロックが発生します。
-
Oracleの排他制御について教え...
-
「マスタ」と「テーブル」の違...
-
データの二重表示の原因
-
重複するキーから一番古い年月...
-
mysql IN句に1データだけ指定...
-
Accessにインポートしたら並び...
-
ACCESSのSQLで、NULLかNULLでな...
-
Accessでフィールドを比較した...
-
エクスポート時の改行コードに...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SELECT時の行ロックの必要性に...
-
SELECT文でのデッドロックに対...
-
accessのロック
-
AccessShareLock はどの程度気...
-
SQLServer Insertが遅い
-
MongoDBのデータ更新はDBを排他...
-
Oracleの排他制御について教え...
-
DB2のロック調査
-
同一トランザクションの中でテ...
-
ExcelからAccess2013DBを更新す...
-
同時書き込み
-
INSERTにおいてロック処理は必要か
-
更新ロックとデッドロック
-
SELECT文でタイムアウト...
-
DB2でSelectした時(rollback,c...
-
UPDATE文で発生するデッドロッ...
-
トランザクション中にSELECTし...
-
SELECT FOR UPDATE にトランザ...
-
ADOで排他ロックがうまくいかない
-
排他ロックしたレコードが、別...
おすすめ情報