web-dev-qa-db-ja.com

SqlServerデータベースを並列に発行すると、「ロックリクエストのタイムアウト期間を超えました」

SqlServer2014を使用した継続的インテグレーション環境で作業しています。そこで、同じインスタンスで多数のSqlServerデータベースを同時に公開する必要があります。私たちの公開プロセスでは、MSBuildによって実行される.sqlprojファイルを使用して、公開スクリプトを生成します。

この公開プロセス中に、「ロックリクエストのタイムアウト期間を超えました」というエラーが発生する場合があります。これは、2つ以上の公開スクリプトが並列に実行されているときに発生します。具体的には、プロシージャsp_fulltext_databaseで発生します。

詳細な説明を検索したところ、デフォルトのロックタイムアウト制限は-1で、無制限であることがわかりました。それでも、エラーは表示され続けます。クエリを通じてロックタイムアウト制限を20秒に変更しようとしています。

SET LOCK_TIMEOUT 20000;

エラーは再発しませんでした。

私の質問は、これが問題を解決する唯一の方法ですか? LOCK_TIMEOUTを変更しますか?公開プロセスは自動生成されたスクリプトによって行われるため、スクリプトを手動で変更することはお勧めしません。

編集:デプロイ中にSqlServerプロファイラーを使用すると、ロックタイムアウトが5秒に変更されていることがわかりました。このコマンドは公開スクリプトに存在しないため、内部コマンドまたは構成がそれを実行していると想定しています。 Sql Server Management Studioに移動し、サーバーを右クリックして、[プロパティ]> [詳細設定]> [並列処理]を選択すると、いくつかの構成が見つかりましたが、この5秒の自動定義には影響しません。

SqlServer Trace

4
Phellipe Silva

sp_fulltext_database に関するMSDNドキュメントを見ると、次のメモが表示されます。

SQL Server 2008以降のバージョンのフルテキストカタログには影響せず、下位互換性のためにのみサポートされています。 sp_fulltext_databaseは、特定のデータベースのFull-Text Engineを無効にしません。 SQL Server 20xxでユーザーが作成したすべてのデータベースは、常にフルテキストインデックスが有効になっています。

上記の「20xx」の「xx」は、参照しているドキュメントのバージョン。ただし、SQL Server 2008以降では、xxは「08」、「12」、または「」になります。 16インチ。

あなたはSQL Server 2014を使用しているので、なぜEXECUTE sp_fulltext_database 'disable';は、SSDTで生成されたデプロイスクリプトにも表示されます。少しテストを行ったところ、プロジェクトの「ターゲットプラットフォーム」が何に設定されていても、デプロイスクリプトは常に次の行を生成しているようです。

IF fulltextserviceproperty(N'IsFulltextInstalled') = 1
    EXECUTE sp_fulltext_database 'enable';

「有効」または「無効」は、「その他」タブの「プロジェクトプロパティ」の「プロジェクト設定」タブにある「データベース設定...」によって制御されます。

これらの2行を取り除く唯一の方法は、プロジェクトプロパティの[デバッグ]タブの[配置オプション]で、[データベースプロパティの配置]オプションをオフにすることです。ただし、このオプションをオフにすると、データベースのプロパティは適用されません。そう:

  • SSDTデプロイメントを使用していないデータベースプロパティを強制している場合は、このオプションのチェックを外してください。最後のビルド以降に他の変更を行っていない場合、この変更だけではデプロイスクリプトは更新されません。その場合、「再ビルド」を行う必要があります。
  • SSDT配置を使用してデータベースプロパティを強制する場合は、これらの2行を手動で削除するか、プログラムで実行する方法を見つけます。

それ以外の未使用のシステムストアドプロシージャへの呼び出しがある理由はわかりません。おそらく何も中断せず、ほとんどの人が並列展開を行っていないため、削除する優先度は低いです;-)。

3
Solomon Rutzky