1.)休眠进程如何阻塞另一个进程? 一个休眠进程正在等待工作。仔细检查是否真的有一个休眠进程阻塞了什么,因为那是不太可能的。 2.)我看到很多睡眠过程...这正常吗? 许多休眠进程是完全正常的。例如,来自一个web服务器的连接池通常保持10个进程打开。这对性能是很好的。 下面是一个list of process states:
Status Meaning
---------------------------------------------------------------------------------
Background The SPID is running a background task, such as deadlock detection.
Sleeping The SPID is not currently executing. This usually indicates that the
SPID is awaiting a command from the application.
Running The SPID is currently running on a scheduler.
Runnable The SPID is in the runnable queue of a scheduler and waiting to get
scheduler time.
Sos_scheduler_yield The SPID was running, but it has voluntarily yielded its
time slice on the scheduler to allow another SPID to acquire
scheduler time.
Suspended The SPID is waiting for an event, such as a lock or a latch.
Rollback The SPID is in rollback of a transaction.
Defwakeup Indicates that the SPID is waiting for a resource that is in the
process of being freed. The waitresource field should indicate the
resource in question.
3条答案
按热度按时间uyto3xhc1#
锁的持有持续时间各不相同,但最常见的阻塞锁(X锁)是在事务的持续时间内持有的。由于事务生存期与批处理生存期完全无关,因此拥有一个休眠SPID来拥有锁是绝对正常的。它仅仅意味着客户机已经开始事务并执行了一些更新。只要客户机决定继续并向服务器发出命令以提交或回滚事务,阻塞就会消失。
其他常见的锁定是数据库会话锁,它是由使用数据库的连接持有的共享锁。维护连接的简单操作将持有锁,但通常这只与试图获取数据库上的X锁的操作冲突,如ALTER DATABASE DDL。
还有一些更深奥的情况,比如在恢复后保持两阶段提交锁,但这些可能不是您的问题。您看到的最有可能是用户从SSMS运行某些内容并忘记提交的小情况,或者是保持长事务的应用程序,甚至可能正在泄漏它们。
t0ybt7op2#
1.)休眠进程如何阻塞另一个进程?
一个休眠进程正在等待工作。仔细检查是否真的有一个休眠进程阻塞了什么,因为那是不太可能的。
2.)我看到很多睡眠过程...这正常吗?
许多休眠进程是完全正常的。例如,来自一个web服务器的连接池通常保持10个进程打开。这对性能是很好的。
下面是一个list of process states:
lnlaulya3#
休眠进程是否像Web应用程序一样等待用户输入?我们遇到过这样的问题,Web应用程序在每次用户请求后都会保持数据库连接打开,以便更高效地运行(因为不必为每次请求重新连接到数据库)。
在SQL代码中检查可能导致此问题的两件事是:
(1)请确保所有
BEGIN TRANSACTION
语句的末尾都有对应的COMMIT TRANSACTION
。否则,它可能会在等待下一个用户请求时错误地保持事务打开。(2)如果应用程序使用
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
运行某些查询,请确保它具有对应的SET TRANSACTION ISOLATION LEVEL READ COMMITTED
(默认值)。我们的应用程序在一些地方缺少这一点,有时会导致后来的请求(比如更新)被无意中作为READ UNCOMMITTED
运行,这是一个烂摊子。它导致一个事务在用户请求之间保持打开,即使启用了自动提交。