锁定提示
可以在 SELECT、INSERT、UPDATE 及 DELETE 语句中为单个表引用指定锁提示。提示指定 SQL Server 数据库引擎实例用于表数据的锁类型或行版本控制。当需要对对象所获得锁类型进行更精细控制时,可以使用表级锁提示。这些锁提示覆盖会话的当前事务隔离级别。
有关特定锁提示及其行为的详细信息,请参阅 表提示 (Transact-SQL)。
注意 |
---|
数据库引擎查询优化器几乎总是会选择正确的锁级别。建议只在必要时才使用表级锁提示来更改默认的锁行为。禁止锁级别反过来会影响并发。 |
数据库引擎在读取元数据时可能必须获取锁,即使是处理使用了防止在读取数据时请求共享锁的锁提示的选择。例如,使用 NOLOCK 提示的 SELECT 在读取数据时不获取共享锁,但有时在读取系统目录视图时可能会请求锁。这意味着可能会阻止使用 NOLOCK 的 SELECT 语句。
如下面的示例中所示,如果将事务隔离级别设置为 SERIALIZABLE,并且在 SELECT 语句中使用表级锁提示 NOLOCK,则不采用通常用于维护可序列化事务的键范围锁。
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)。