
いつも勉強させて頂いております。どうぞよろしくお願いします。
以下の環境で開発を行っています。
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で質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- その他(データベース) 更新クエリをリンクデータベーステーブルに実行し実行時エラー3362固有インデックスに重複する値が含ま 1 2022/09/21 11:44
- Access(アクセス) AccessVBAで降順にするテーブル作成クエリを使用して作成したテーブルを削除し同一のテーブル作成 1 2023/01/06 11:17
- Access(アクセス) Access DAOのExecuteメソッドのオプション(RecordsetOptionEnum)に 1 2022/09/19 07:34
- PHP クエリObjectをforeachで回す時に、次のレコードへ移動せずに次のレコードを取得したい 2 2022/07/28 15:29
- MySQL 書籍の内容はまともでしょうか? 1 2023/01/22 03:07
- Visual Basic(VBA) ExcelVBAのマクロについて。 9 2022/05/04 14:50
- MySQL PhpMyAdminで作成して実行せよ。 東京23区を、皇居を中心とした4つのエリア(南東, 南西, 1 2023/06/11 11:58
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
今、見られている記事はコレ!
-
弁護士が語る「合法と違法を分けるオンラインカジノのシンプルな線引き」
「お金を賭けたら違法です」ーーこう答えたのは富士見坂法律事務所の井上義之弁護士。オンラインカジノが違法となるかどうかの基準は、このように非常にシンプルである。しかし2025年にはいって、違法賭博事件が相次...
-
釣りと密漁の違いは?知らなかったでは済まされない?事前にできることは?
知らなかったでは済まされないのが法律の世界であるが、全てを知ってから何かをするには少々手間がかかるし、最悪始めることすらできずに終わってしまうこともあり得る。教えてgooでも「釣りと密漁の境目はどこです...
-
カスハラとクレームの違いは?カスハラの法的責任は?企業がとるべき対応は?
東京都が、客からの迷惑行為などを称した「カスタマーハラスメント」、いわゆる「カスハラ」の防止を目的とした条例を、全国で初めて成立させた。条例に罰則はなく、2025年4月1日から施行される。 この動きは自治体...
-
なぜ批判コメントをするの?その心理と向き合い方をカウンセラーにきいた!
今や生活に必要不可欠となったインターネット。手軽に情報を得られるだけでなく、ネットを介したコミュニケーションも一般的となった。それと同時に顕在化しているのが、他者に対する辛らつな意見だ。ネットニュース...
-
大麻の使用罪がなかった理由や法改正での変更点、他国との違いを弁護士が解説
ドイツで2024年4月に大麻が合法化され、その2ヶ月後にサッカーEURO2024が行われた。その際、ドイツ警察は大会運営における治安維持の一つの方針として「アルコールを飲んでいるグループと、大麻を吸っているグループ...
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SELECT文でのデッドロックに対...
-
SELECT時の行ロックの必要性に...
-
INSERTにおいてロック処理は必要か
-
MySQLがPostgreSQLより優れてい...
-
排他的ロック
-
MySQLのトランザクションについて
-
SQLServer Insertが遅い
-
MySqlのロックについて
-
トランザクションとlast_insert_id
-
排他ロックしたレコードが、別...
-
AccessShareLock はどの程度気...
-
SQLServerの明示的なロックの仕...
-
accessのロック
-
「マスタ」と「テーブル」の違...
-
ACCESS2007 フォーム 「バリア...
-
ACCESSのSQLで、NULLかNULLでな...
-
accessのエクスポートエラーに...
-
sqlserverで集計結果をUPDATEし...
-
mysql IN句に1データだけ指定...
-
3つ以上のテーブルをUNIONする...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SELECT文でのデッドロックに対...
-
SELECT時の行ロックの必要性に...
-
SQLServer Insertが遅い
-
accessのロック
-
Oracleの排他制御について教え...
-
AccessShareLock はどの程度気...
-
SELECT文でタイムアウト...
-
UPDATE文で発生するデッドロッ...
-
INSERTにおいてロック処理は必要か
-
DB2でSelectした時(rollback,c...
-
max+1で初番する場合 for updat...
-
排他ロックしたレコードが、別...
-
更新ロックとデッドロック
-
パススルークエリでのロックに...
-
ExcelからAccess2013DBを更新す...
-
同一トランザクションの中でテ...
-
デッドロックが発生します。
-
トランザクション中にSELECTし...
-
同時書き込み
-
SQLServerの明示的なロックの仕...
おすすめ情報