ロック ヒント
SELECT、INSERT、UPDATE、DELETE の各ステートメント内で参照する個別のテーブルにロック ヒントを指定できます。ロック ヒントでは、SQL Server データベース エンジンのインスタンスがテーブル データに使用するロックの種類や行のバージョン管理が指定されます。テーブルレベルのロック ヒントは、オブジェクトにかけるロックの種類を詳細に制御する場合に使用できます。これらのロック ヒントは、セッションの現在のトランザクション分離レベルよりも優先されます。
ロック ヒントの指定とその動作の詳細については、「テーブル ヒント (Transact-SQL)」を参照してください。
注 |
---|
データベース エンジンのクエリ オプティマイザーでは、ほとんどの場合、適切なロック レベルが選択されます。必要な場合に限り、テーブルレベルのロック ヒントを使用して既定のロック動作を変更することをお勧めします。ロック レベルを禁止すると、同時実行性が低下することがあります。 |
データベース エンジンでは、データの読み取り時に共有ロックの要求を回避するロック ヒントが指定された SELECT を処理している場合でも、メタデータの読み取り時にロックの取得が必要になる場合があります。たとえば、NOLOCK ヒントを使用する SELECT では、データの読み取り時には共有ロックが取得されませんが、システム カタログ ビューの読み取り時にはロックが要求される場合があります。そのため、NOLOCK を使用する SELECT ステートメントはブロックされる可能性があります。
次の例のように、トランザクションの分離レベルを SERIALIZABLE に設定し、テーブルレベルのロック ヒントとして NOLOCK を SELECT ステートメントで使用すると、シリアル化可能なトランザクションの管理に通常使用されるキー範囲ロックが取得されません。
USE AdventureWorks2008R2;
GO
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
GO
BEGIN TRANSACTION;
GO
SELECT Title
FROM HumanResources.Employee WITH (NOLOCK);
GO
-- Get information about the locks held by
-- the transaction.
SELECT
resource_type,
resource_subtype,
request_mode
FROM sys.dm_tran_locks
WHERE request_session_id = @@spid;
-- End the transaction.
ROLLBACK;
GO
獲得されるロックのうち HumanResources.Employee を参照するのはスキーマ安定度 (Sch-S) ロックのみです。この場合、シリアル化可能性は保証されません。
SQL Server 2008 では、ALTER TABLE の LOCK_ESCALATION オプションを指定することでテーブル ロックの使用を回避し、パーティション テーブルに対する HoBT ロックを有効にすることができます。このオプションはロック ヒントではありませんが、ロックのエスカレーションを減らすために使用することができます。詳細については、「ALTER TABLE (Transact-SQL)」を参照してください。