2011-06-24 170 views
4

SQL Server SPでロックタイムアウトを延長しようとすると問題が発生します。何を試しても、ロック要求のタイムアウト時間を超えています。 SPを呼び出す前にSQLサーバー「ロック要求のタイムアウト時間を超過しました」再度

SET LOCK_TIMEOUT 10000 inside the SP and with con.createStatement().execute("SET LOCK_TIMEOUT 10000 "): 私は、java + JTDS 1.2.2、C3P0 0.9.1およびSQL Server 2008 私が試した設定を使用しています。 とSPステートメントの場合:statement.setQueryTimeout(10);

SPがによって呼び出されます。■tatement = con.prepareCall("dbo.store_procedure ?,?,?", ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); 、それは

内部の "SETトランザクション分離レベルREPEATABLE READ" いずれかのsugestionsを設定しますか?誰も似たような問題がある? ありがとうございます

+0

あなたは 'REPEATABLE READ'を使用しており、ロックの問題がありますか?おそらく2つは関連しているでしょう。なぜあなたは 'REPEATABLE READ'を使っていますか? – JNK

+0

私たちは、SQL Serverのインスタンスにアクセスするクラスタ化されたアプリケーションを持っていて、REPEATABLE READ(またはSERIALIZABLE)を使用することは、重要なテーブルへのオーダーアクセスを保証する唯一の方法でした。 「(ROWLOCK、UPDLOCK、NOWAIT)」および「INSERT INTO criticalTable with(ROWLOCK、NOWAIT)」で「select * from criticalTable」も使用します。お返事ありがとう – francisco

答えて

1

SQL Server 2008以降を使用せず、LOCK_ESCALATION = Disabledを指定している場合は、ROWLOCKヒントを忘れることがあります。 SQL Serverは、自分の経験から、おそらくそれを無視してロック(ページまたはテーブル)を取ることができます。 SQL Server 2008の前に強制的なロックヒントはありません。

これをクリアしたら、無限のタイムアウトを指定するのにSET LOCK_TIMEOUT -1を使用できます。

私はあなたがそうすることを非常にお勧めします。代わりに、実際にはそのテーブルをロックする必要があるクエリをトラブルシューティングや最適化(あなたが担当していると仮定します)できるだけ速くして、 。あなたはロック・タイムアウトを設定している、接続プールを使用している場合、SET LOCK_TIMEOUTは、現在の接続のタイムアウトを設定します。実際には別の発言

を取られているロックの種類をチェックするためにEXEC sp_lock TargetSPIDとリソースをロックし

モニターその接続を再利用してアプリケーションで意図しない動作を引き起こす可能性があるものすべて

0

トランザクションがまだ進行中であるかどうかを確認します。この問題の原因の1つは、コミットされていないトランザクションまたはロールバックされていないトランザクションを持つことです。

SELECT @@ TRANCOUNT

使用するすべての既存のトランザクションをチェックするために上記のコマンド。コミットまたはロールバックします。

1

トランザクションがまだ進行中であるかどうかを確認してください。この問題の原因の1つは、コミットされていないトランザクションまたはロールバックされていないトランザクションを持つことです。

SELECT @@ TRANCOUNT

使用するすべての既存のトランザクションをチェックするために上記のコマンド。コミットまたはロールバックします。

関連する問題