ロック タイムアウト

Microsoft SQL Server 2005 Compact Edition (SQL Server Compact Edition) において、1 つのトランザクションが既にロックを取得しているリソースに対し、別のトランザクションが競合するロックを取得しようとすると、後のトランザクションはロックを取得できず、最初のトランザクションがロックを解放するまでブロック状態になります。この状況は、デッドロックが原因で発生することもあります。SQL Server Compact Edition の既定のロック タイムアウトは 2 秒です。リソースをロックする前に、そのリソースが既にロックされているかどうかを判断するには、データにアクセスして、タイムアウトになるかどうかを確認するしか方法がありません。

メモ :
sys.lock_information システム ビューを使用して、ロック要求がブロックされているかどうかを判断し、ブロックされている原因を特定するのに役立てることができます。詳細については、「ロックに関する情報の表示」を参照してください。

LOCK_TIMEOUT 設定では、ブロックされたリソースに対するステートメントの最大待機時間を設定できます。ステートメントの待機時間が LOCK_TIMEOUT に設定された時間を超えると、ブロックされたステートメントは自動的にキャンセルされ、エラー メッセージ SSCE_M_LOCKTIMEOUT (ロックの待機中に、システムがタイムアウトしました。) がアプリケーション側に返されます。ただし、SQL Server Compact Edition ではそのステートメントを含むトランザクションがロールバックまたはキャンセルされることはありません。アプリケーション側で、エラー メッセージ SSCE_M_LOCKTIMEOUT をトラップするエラー処理ルーチンを用意する必要があります。アプリケーションでエラーがトラップされない場合、アプリケーションはトランザクション内の 1 つのステートメントがキャンセルされたことを知らないまま実行し続けます。トランザクション内の後続のステートメントは実行されなかったステートメントに依存している場合があるので、エラーが発生することがあります。

エラー メッセージ SSCE_M_LOCKTIMEOUT をトラップするエラー処理ルーチンを実装すると、ブロックされたステートメントを自動的に再送信したり、トランザクション全体をロールバックするなど、タイムアウトが発生したときにアプリケーション側で対応して、救済措置を行えます。

セッションに現在の LOCK_TIMEOUT 値を設定するには、次のコード例に示すような SET LOCK_TIMEOUT 構文を実行します。

SET LOCK_TIMEOUT 2000;

参照

概念

ロックについて
トランザクション分離レベル
ロック ヒント (SQL Server Compact Edition)

ヘルプおよび情報

SQL Server Compact Edition のサポートについて