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