Attribute | 值 |
---|---|
产品名称 | SQL Server |
事件 ID | 1204 |
事件源 | MSSQLSERVER |
组件 | SQLEngine |
符号名称 | LK_OUTOF |
消息正文 | SQL Server 数据库引擎的实例此时无法获得 LOCK 资源。 请在活动用户较少时重新运行该语句。 请询问数据库管理员,检查此实例的锁定和内存配置,或检查是否有长时间运行的事务。 |
在执行期间,查询会频繁获取并释放其访问的资源的锁。 获取锁会占用可用锁结构池中的锁结构。 当由于池中没有更多可用的锁结构而无法获取新锁时,将返回错误 1204 消息。 此问题可能是由于以下任一原因造成的:
SQL Server无法分配更多内存,要么是因为其他进程正在使用内存,要么是因为SQL Server已用尽其所有内存,并且达到了使用配置选项 max 服务器内存配置的值。
锁管理器不会使用超过 60% 的可用于SQL Server的内存,并且已达到阈值。
已将系统存储过程的配置选项锁sp_configure设置为非默认、非动态值。
你已在SQL Server上启用了跟踪标志 1211、1224 或两者来控制锁升级行为,并且正在执行需要多个锁的查询。
如果怀疑SQL Server无法分配足够的内存,请尝试以下操作:
使用类似于以下查询的查询,确定SQL Server内是否有任何其他内存职员已用尽SQL Server配置内存的大部分:
SELECT pages_kb, type, name, virtual_memory_committed_kb, awe_allocated_kb
FROM sys.dm_os_memory_clerks
ORDER BY pages_kb DESC
然后减少该内存职员的内存消耗,以允许锁内存使用更多资源。 有关详细信息,请参阅排查SQL Server中的内存不足或内存不足问题。
如果除 SQL Server 外的应用程序正在占用资源,请尝试停止这些应用程序,或者考虑在单独的服务器上运行它们。 这将释放其他进程的内存,用于SQL Server。
如果已配置 最大服务器内存,请增加 最大服务器内存 设置。
如果怀疑锁管理器使用了最大可用内存量,请确定持有最多锁的事务并终止它。 以下脚本将标识锁数最多的事务:
SELECT request_session_id, COUNT (*) num_locks
FROM sys.dm_tran_locks
GROUP BY request_session_id
ORDER BY count (*) DESC
获取最高会话 ID,并使用 KILL 命令终止它。
如果对 locks
使用非默认值,请使用 sp_configure
通过以下语句将 的值 locks
更改为其默认设置:
EXEC sp_configure 'locks', 0
如果在使用SQL Server跟踪标志 1211 和/或 1224 时遇到上述错误消息,请查看它们的用法,并在执行需要大量锁的查询时禁用它们。 有关详细信息,请查看 DBCC TRACEON – 跟踪标志 (Transact-SQL) 并解决SQL Server中锁升级导致的阻塞问题。