sql server 2000阻塞和死锁问题的查看与解决方法

数据库发生阻塞和死锁的现象:

一、数据库阻塞的现象:第一个连接占有资源没有释放,而第二个连接需要获取这个资源。如果第一个连接没有提交或者回滚,第二个连接会一直等待下去,直到第一个连接释放该资源为止。对于阻塞,数据库无法处理,所以对数据库操作要及时地提交或者回滚。
二、数据库死锁的现象:第一个连接占有资源没有释放,准备获取第二个连接所占用的资源,而第二个连接占有资源没有释放,准备获取第一个连接所占用的资源。这种互相占有对方需要获取的资源的现象叫做死锁。对于死锁,数据库处理方法:牺牲一个连接,保证另外一个连接成功执行。

例如,一个客户端应用程序线程有两个开放式连接。该线程异步启动事务并在第一个连接上发出查询。应用程序随后启动其它事务,在另一个连接上发出查询并等待结果。当 SQL   Server   返回其中一个连接的结果时,应用程序开始处理这些结果。应用程序就这样处理结果,直到生成结果的查询被另一个连接上执行的查询阻塞而导致再没有可用的结果为止。此时第一个连接阻塞,无限期等待处理更多的结果。第二个连接没有在锁上阻塞,但仍试图将结果返回给应用程序。然而,由于应用程序阻塞而在第一个连接上等待结果,第二个连接的结果将得不到处理。

下面是查看并处理sql server 2000阻塞和死锁的方法:

复制代码 代码如下:
use master --必须在master数据库中创建
go
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_lockinfo]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[p_lockinfo]
GO
/*--处理死锁
查看当前进程,或死锁进程,并能自动杀掉死进程
因为是针对死锁的,所以如果有死锁进程,只能查看死锁进程
当然,你可以通过参数控制,不管有没有死锁,都只查看死锁进程
*/
/*--调用示例
exec p_lockinfo
--*/
create proc p_lockinfo
@kill_lock_spid bit=0,   --是否杀掉死锁的进程,1 杀掉, 0 仅显示
@show_spid_if_nolock bit=1 --如果没有死锁的进程,是否显示正常进程信息,1 显示,0 不显示
as
set nocount on
declare @count int,@s nvarchar(1000),@i int
select id=identity(int,1,1),标志,
进程ID=spid,线程ID=kpid,块进程ID=blocked,数据库ID=dbid,
数据库名=db_name(dbid),用户ID=uid,用户名=loginame,累计CPU时间=cpu,
登陆时间=login_time,打开事务数=open_tran, 进程状态=status,
工作站名=hostname,应用程序名=program_name,工作站进程ID=hostprocess,
域名=nt_domain,网卡地址=net_address
into #t from(
select 标志='死锁的进程',
   spid,kpid,a.blocked,dbid,uid,loginame,cpu,login_time,open_tran,
   status,hostname,program_name,hostprocess,nt_domain,net_address,
   s1=a.spid,s2=0
from master..sysprocesses a join (
   select blocked from master..sysprocesses group by blocked
   )b on a.spid=b.blocked where a.blocked=0
union all
select '|_牺牲品_>',
   spid,kpid,blocked,dbid,uid,loginame,cpu,login_time,open_tran,
   status,hostname,program_name,hostprocess,nt_domain,net_address,
   s1=blocked,s2=1
from master..sysprocesses a where blocked<>0
)a order by s1,s2
select @count=@@rowcount,@i=1
if @count=0 and @show_spid_if_nolock=1
begin
insert #t
select 标志='正常的进程',
   spid,kpid,blocked,dbid,db_name(dbid),uid,loginame,cpu,login_time,
   open_tran,status,hostname,program_name,hostprocess,nt_domain,net_address
from master..sysprocesses
set @count=@@rowcount
end
if @count>0
begin
create table #t1(id int identity(1,1),a nvarchar(30),b Int,EventInfo nvarchar(255))
if @kill_lock_spid=1
begin
   declare @spid varchar(10),@标志 varchar(10)
   while @i<=@count
   begin
    select @spid=进程ID,@标志=标志 from #t where id=@i
    insert #t1 exec('dbcc inputbuffer('+@spid+')')
    if @@rowcount=0 insert #t1(a) values(null)
    if @标志='死锁的进程' exec('kill '+@spid)
    set @i=@i+1
   end
end
else
   while @i<=@count
   begin
    select @s='dbcc inputbuffer('+cast(进程ID as varchar)+')' from #t where id=@i
    insert #t1 exec(@s)
    if @@rowcount=0 insert #t1(a) values(null)
    set @i=@i+1
   end
select a.*,进程的SQL语句=b.EventInfo
from #t a join #t1 b on a.id=b.id
order by 进程ID
end
set nocount off
go

通过的 Transact-SQL 将解决sql server 2000阻塞和死锁问题

时间: 2024-09-22 08:53:30

sql server 2000阻塞和死锁问题的查看与解决方法的相关文章

sql server 2000阻塞和死锁问题的查看与解决方法_MsSql

数据库发生阻塞和死锁的现象: 一.数据库阻塞的现象:第一个连接占有资源没有释放,而第二个连接需要获取这个资源.如果第一个连接没有提交或者回滚,第二个连接会一直等待下去,直到第一个连接释放该资源为止.对于阻塞,数据库无法处理,所以对数据库操作要及时地提交或者回滚.二.数据库死锁的现象:第一个连接占有资源没有释放,准备获取第二个连接所占用的资源,而第二个连接占有资源没有释放,准备获取第一个连接所占用的资源.这种互相占有对方需要获取的资源的现象叫做死锁.对于死锁,数据库处理方法:牺牲一个连接,保证另外

sql server定时作业调用Kettle job出错的快速解决方法_MsSql

错误信息: Unable to list jar files in plugin folder 'C:\Windows\system32\config\systemprofile\.kettle\plugins' Unable to get VFS File object for filename 'C:\Windows\system32\config\systemprofile\.kettle\plugins' : Could not find file with URI "C:\Window

sql server定时作业调用Kettle job出错的快速解决方法

错误信息: Unable to list jar files in plugin folder 'C:\Windows\system32\config\systemprofile\.kettle\plugins' Unable to get VFS File object for filename 'C:\Windows\system32\config\systemprofile\.kettle\plugins' : Could not find file with URI "C:\Window

如何监视 SQL Server 2000 阻塞

server 概要本文是以下 Microsoft 知识库文章的 Microsoft SQL Server 2000 版的更新,它适用于 Microsoft SQL Server 7.0: 251004 (http://support.microsoft.com/kb/251004/) 如何监视 SQL Server 7.0 阻塞 本文提供可用于诊断阻塞和性能问题的存储过程的用法和设计.有关如何了解和解决阻塞问题的说明,请参阅以下 Microsoft 知识库文章: 224453 (http://s

重装MS SQL Server 2000前必须彻底删除原安装文件的方法_MsSql

重装MS SQL Server 2000一般需要彻底删除原安装文件,以前总是无法重新安装,默认被占了,现在网上看到了特用如下方法对付安装挂起问题:  1.在开始->运行中输入regedit  2.到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager 位置  3.选择文件->导出,保存(安全起见)  4.在右边窗口右击PendingFileRenameOperations,选择删除,然后确认

重装MS SQL Server 2000前必须彻底删除原安装文件的方法

重装MS SQL Server 2000一般需要彻底删除原安装文件,以前总是无法重新安装,默认被占了,现在网上看到了特 用如下方法对付安装挂起问题:  1.在开始->运行中输入regedit  2.到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager 位置  3.选择文件->导出,保存(安全起见)  4.在右边窗口右击PendingFileRenameOperations,选择删除,然后确认

Sql Server安装出错,安装程序配置服务器失败的解决方法小结_mssql2005

错误重现:首先在控制面板里卸载了sqlserver软件,一切正常,然后重启(一定要重启,否则没法重装),执行sqlserver的安装程序,一切似乎都正常,一路下一步,安装到了最后,突然提示"安装程序配置服务器失败". 当出现安装程序配置服务器失败时,可以试着用一下方法解决 推荐方法: 在安装SQL Server 2000时,安装快要完成,到最后提示一个错误,如上图,怎么解决呢,不急,请看下面的方法: 把上次安装时产生的"Microsoft SQL Server"文件

SQL Server 2005 企业版没有 Management Studio管理工具的解决方法_应用技巧

在网上找找了半天有以下几种情况: 1.可以直接装上,装上就有. 2.装上后没有,然后把sql 2005全部卸载后再装就有了. 3.装上后没有,从微软官方网站上下载一下:Microsoft SQL Server Management Studio Express, 装上就可以用了. 4.重装系统,先装SQL Server 2005,再装vs2008   看到上面的方法,对我来说可能只有第三种是最好的了,但他是Express,我这人好像有个这个缺 点,如果他不是最好的,而别人可以做到最好的,我就一定

sql server 2008 用户 NT AUTHORITY\IUSR 登录失败的解决方法_mssql2008

用户 'NT AUTHORITY\IUSR' 登录失败. 其实这样的情况,要不就是用户名密码不正确,要不就是用户无法登录sql server 2008.一步一步分析. 1.首先asp连接sql server 2008数据库应该没有问题. 之前我用了多种方法,链接数据库,其实链接2000与2005.2008的无区别 需要注意的是: DataServer = "127.0.0.1" DataServer = "(local)" 都是可以使用的 ConnStr="