SQL Server 2005休眠SPID正在阻止其他SPID

7d7tgy0s  于 2023-02-07  发布在  SQL Server
关注(0)|答案(3)|浏览(138)

我发现我的SQL Server数据库中有许多休眠进程,看起来其中一个休眠SPID阻塞了另一个进程,该进程也被挂起了...
有人能解释一下吗...
1.)一个休眠进程怎么会阻塞另一个进程呢?2.)我看到很多休眠进程...这正常吗?
谢谢

uyto3xhc

uyto3xhc1#

锁的持有持续时间各不相同,但最常见的阻塞锁(X锁)是在事务的持续时间内持有的。由于事务生存期与批处理生存期完全无关,因此拥有一个休眠SPID来拥有锁是绝对正常的。它仅仅意味着客户机已经开始事务并执行了一些更新。只要客户机决定继续并向服务器发出命令以提交或回滚事务,阻塞就会消失。
其他常见的锁定是数据库会话锁,它是由使用数据库的连接持有的共享锁。维护连接的简单操作将持有锁,但通常这只与试图获取数据库上的X锁的操作冲突,如ALTER DATABASE DDL。
还有一些更深奥的情况,比如在恢复后保持两阶段提交锁,但这些可能不是您的问题。您看到的最有可能是用户从SSMS运行某些内容并忘记提交的小情况,或者是保持长事务的应用程序,甚至可能正在泄漏它们。

t0ybt7op

t0ybt7op2#

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.
lnlaulya

lnlaulya3#

休眠进程是否像Web应用程序一样等待用户输入?我们遇到过这样的问题,Web应用程序在每次用户请求后都会保持数据库连接打开,以便更高效地运行(因为不必为每次请求重新连接到数据库)。
在SQL代码中检查可能导致此问题的两件事是:
(1)请确保所有BEGIN TRANSACTION语句的末尾都有对应的COMMIT TRANSACTION。否则,它可能会在等待下一个用户请求时错误地保持事务打开。
(2)如果应用程序使用SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED运行某些查询,请确保它具有对应的SET TRANSACTION ISOLATION LEVEL READ COMMITTED(默认值)。我们的应用程序在一些地方缺少这一点,有时会导致后来的请求(比如更新)被无意中作为READ UNCOMMITTED运行,这是一个烂摊子。它导致一个事务在用户请求之间保持打开,即使启用了自动提交。

相关问题