web-dev-qa-db-ja.com

SQL Serverでクエリタイムアウトを強制する

データベースの速度が遅い場合に、応答が不十分なコードブロックの問題が発生しました(クエリタイムアウトでベッドを破壊します)。パッチを作成しましたが、リグレッションで実行中です。

タイムアウトは取得できません。 SQL Mgmt Studioからトランザクションを開き、すべての行を更新してロックしましたが、INSERTがタイムアウトすることはありません(これが必要です)。

T-SQLを介して簡単にテーブルレベルのロックを取得できますか?または、マスターをいじる必要がありますか?または、ロックせずにタイムアウトを簡単に強制できますか?どんな入力でも大歓迎です。

75
BnWasteland

これを実行してから挿入を試してください...

select * from yourTable with (holdlock,tablockx)

ここでは、5分間ロックできます。

BEGIN TRANSACTION

SELECT * FROM yourTable WITH (TABLOCKX, HOLDLOCK)

WHERE 0 = 1

WAITFOR DELAY '00:05'

ROLLBACK TRANSACTION
122
KM.

返す前に1分間待機するようにSQLコードに指示することができます。

WaitFor Delay '00:01:00'
28
David

ヒント:接続を構成できる場合は、接続文字列のタイムアウトを1秒に短縮します。これにより簡単になります。テーブルに大量のデータを入力し、他の3つのプロセスをループでスピンさせて、そのテーブルのチャンクをループ周辺のトランザクションで更新します。アプリによって呼び出される実際のプロシージャを変更しないでください(waitforを挿入)。それは統合テストを無効にします。

しかし、実際には、これは単体テストと依存性注入を支持するケーススタディです。統合テストが難しいものもあります。単体テスト+ 依存性注入

  • 実際:がらくたコード->データベースのタイムアウト(再現が難しい)。
  • リファクタリング:くだらないコード->リポジトリ(データアクセスのみを行う)->データベース
  • 単体テスト:くだらないコード> モックリポジトリ スローする-> null
  • これで、がらくたを修正できるコードのテストに失敗しました。

これは「依存」注入です。開発者は、依存関係の動作をシミュレートする何かを代用して、データベースに依存関係を注入できます。すべてのデータベーステストに対して実行できます。とにかく、単体テストが適切に行われていれば、修正プログラムが必要な処理を行うことはわかっていますが、それでも統合テストが必要です。この場合、リグレッションに重点を置くことができます。つまり、テストしても他に何も壊れず、機能は引き続き機能します。

すでにパッチを作成しているので、私の答えは遅すぎると思います。

9
Precipitous

このブログ投稿をご覧ください。基本的に、SQL Serverにはクエリタイムアウトはありません。クライアントはSQLタイムアウトを強制できますが、エンジン自体は強制しません。

http://blogs.msdn.com/khen1234/archive/2005/10/20/483015.aspx

5
DL Redden