通过 sysprocesses 简单查询死锁及解决死锁办法

简单查询死锁,如下四步可以轻松解决: 

第一步:查询死锁语句

1: 条件是 blocked <> 0

select dbid,* from sys.sysprocesses
where 1=1
and spid >50
and blocked <> 0
--and spid= 62

查询结果如下图所示:


以上查询得出:

  • 受影响的数据库ID 是 5;
  • 受到阻塞的会话有1301、1306、869、109;
  • 阻塞会话是961;

第二步:查询发生阻塞或死锁的当前数据库

1:通过第一步查询,知道数据库ID 为 DBID=5。

2:sp_helpdb   或    Select name,dbid from master.sys.sysdatabases  查询数据库名称

 


第三步:查询发生阻塞或死锁的SQL语句

输出死锁的执行的语句:
dbcc inputbuffer(961)

语句如下:

select o.tp_Login,o.tp_Title, CONVERT(varchar(10),a.TimeCreated,120)  as accessingdate,count(*) as docnum, 'sps' as type  from UserData u,AllDocs a, userinfo o ,webs w where a.ListId = u.tp_ListId and a.Id = u.tp_docID  and w.Id = a.WebId and w.SiteId = a.SiteId and w.SiteId = o.tp_SiteID and..........以后省去

 

第四步:杀死锁

kill  961

之后再从第一步进行查询,看是否还存在死锁;

从第二步、第三步,查询出了出问题的锁死数据库及SQL语句,便于分析彻底解决死锁问题。

 

以下是sysprocesses 表中保存关于运行在 Microsoft® SQL Server™ 上的进程的信息。这些进程可以是客户端进程或系统进程。sysprocesses 只存储在master 数据库中。

 

列名数据类型描述
spidsmallintSQL Server 进程 ID。
kpidsmallintMicrosoft Windows NT 4.0® 线程 ID。
blockedsmallint分块进程的进程 ID (spid)。
waittypebinary(2)保留。
waittimeint当前等待时间(以毫秒为单位)。当进程不处于等待时,为 0。
lastwaittypenchar(32)表示上次或当前等待类型名称的字符串。
waitresourcenchar(32)锁资源的文本化表示法。
dbidsmallint当前正由进程使用的数据库 ID。
uidsmallint执行命令的用户 ID。
cpuint进程的累计 CPU 时间。无论 SET STATISTICS TIME ON 选项是 ON 还是 OFF,都为所有进程更新该条目。
physical_ioint进程的累计磁盘读取和写入。
memusageint当前分配给该进程的过程高速缓存中的页数。一个负数,表示进程正在释放由另一个进程分配的内存。
login_timedatetime客户端进程登录到服务器的时间。对于系统进程,是存储 SQL Server 启动发生的时间。
last_batchdatetime客户端进程上次执行远程存储过程调用或 EXECUTE 语句的时间。对于系统进程,是存储 SQL Server 启动发生的时间。
ecidsmallint用于唯一标识代表单个进程进行操作的子线程的执行上下文 ID。
open_transmallint进程的打开事务数。
statusnchar(30)进程 ID 状态(如运行、休眠等)。
sidbinary(85)用户的全局唯一标识符 (GUID)。
hostnamenchar(128)工作站的名称。
program_namenchar(128)应用程序的名称。
hostprocessnchar(8)工作站进程 ID 号。
cmdnchar(16)当前正在执行的命令。
nt_domainnchar(128)客户端的 Windows NT 4.0 域(如果使用 Windows 身份验证)或信任连接的 Windows NT 4.0 域。
nt_usernamenchar(128)进程的 Windows NT 4.0用户名(如果使用 Windows 身份验证)或信任连接的 Windows NT 4.0 用户名。
net_addressnchar(12)指派给每个用户工作站上的网络接口卡唯一标识符。当用户登录时,该标识符插入 net_address 列。
net_librarynchar(12)用于存储客户端网络库的列。每个客户端进程都在网络连接上进入。网络连接有一个与这些进程关联的网络库,该网络库使得这些进程可以建立连接。有关更多信息,请参见客户端和服务器 Net-Library
loginamenchar(128)登录名。
  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
SqlServer 恢复挂起的解决方法如下: 1. 检查是否存在死锁。可以查看 SQL Server 错误日志和系统事件日志,以确定是否存在死锁。 2. 检查是否存在长时间运行的事务。可以使用以下查询来查找长时间运行的事务: SELECT transaction_id, transaction_begin_time, DATEDIFF(SECOND, transaction_begin_time, GETDATE()) AS duration_seconds FROM sys.dm_tran_active_transactions WHERE DATEDIFF(SECOND, transaction_begin_time, GETDATE()) > 30 如果查询结果显示了运行时间超过 30 秒的事务,则可以考虑终止这些事务。 3. 检查是否存在大量的争用。可以使用以下查询来查找争用情况: SELECT DB_NAME(resource_database_id) AS database_name, resource_type, request_mode, COUNT(*) AS lock_count FROM sys.dm_tran_locks GROUP BY resource_database_id, resource_type, request_mode ORDER BY lock_count DESC 如果查询结果显示了某个数据库中存在大量的争用,可以考虑优化查询或调整级别。 4. 检查是否存在过多的并发连接。可以使用以下查询来查找并发连接数: SELECT DB_NAME(dbid) AS database_name, COUNT(*) AS connection_count FROM sys.sysprocesses GROUP BY dbid ORDER BY connection_count DESC 如果查询结果显示了某个数据库中存在过多的并发连接,可以考虑增加硬件资源或优化查询。 5. 调整 SqlServer 的配置参数。可以根据实际情况调整 SqlServer 的配置参数,如最大并发连接数、最大内存限制等。 以上是一些常见的 SqlServer 恢复挂起的解决方法,希望能对你有帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值