SQL超过锁请求

---超过锁请求

http://blog.sina.com.cn/s/blog_7fb3b1840100u4dj.html

1、查询造成死锁的SQL语句

当SQL数据库的监控报警显示死锁进程数过多时,首先应该找出造成死锁的SQL语句是什么,打开“查询分析器”,将如下的存储过程输入到文本框中,检查语法,然后运行:

use master
go
CREATE PROCEDURE sp_who_lock AS
begin
declare @spid int,@bl int,
@intTransactionCountOnEntry int,
@intRowcount int,
@intCountProperties int,
@intCounter int
create table #tmp_lock_who(
id int identity(1,1),
spid smallint,
bl smallint)
if @@error<>0 return @@error
insert into #tmp_lock_who(spid,bl)
select 0,blocked
from (select * from sysprocesses where blocked>0) a
where not exists (select * from (select * from sysprocesses where blocked>0) b where a.blocked=spid)
union select spid,blocked from sysprocesses where blocked>0
if @@error<>0 return @@error
--找到临时表的记录数
select @intCountProperties=count(*),@intCounter=1
from #tmp_lock_who
if @@error<>0 return @@error
if @intCountProperties=0
select ‘现在没有阻塞信息‘ as message
--循环开始
while @intCounter<[email protected]
begin
select @spid=spid,@bl=bl
from #tmp_lock_who where [email protected]
begin
if @spid=0
select ‘引起数据库死锁的是:‘+cast(@bl as varchar(10))+‘进程号,其执行的SQL语法如下‘
else
select ‘进程号spid:‘+cast(@spid as varchar(10))+‘被‘+‘进程号spid‘+cast(@bl as varchar(10))+‘阻塞,其执行的SQL语法如下‘
DBCC inputbuffer(@bl)
end
set @[email protected]+1
end
drop table #tmp_lock_who
return 0
end
运行完毕,输入exec sp_who_lock 执行存储过程,这时候就可以明确的找出哪个SQL语句造成的死锁和阻塞。

2、杀死锁和进程
我们找出了引起死锁的语句,那么如何去手动的杀死进程和锁?最简单的办法,重新启动服务。但是这里要介绍一个存储过程,通过显式的调用,可以杀死进程和锁。

use master
go

if exists (select * from dbo.sysobjects where id = object_id(N‘[dbo].[p_killspid]‘) and OBJECTPROPERTY(id, N‘IsProcedure‘) = 1)
drop procedure [dbo].[p_killspid]
GO

create proc p_killspid
@dbname varchar(200) --要关闭进程的数据库名
as
declare @sql nvarchar(500)
declare @spid nvarchar(20)

declare #tb cursor for
select spid=cast(spid as varchar(20)) from master..sysprocesses where dbid=db_id(@dbname)
open #tb
fetch next from #tb into @spid
while @@fetch_status=0
begin
exec(‘kill ‘[email protected])
fetch next from #tb into @spid
end
close #tb
deallocate #tb
go

--用法
exec p_killspid ‘newdbpy‘

3、查看锁信息

如何查看系统中所有锁的详细信息?在企业管理管理器中,我们可以看到一些进程和锁的信息,这里介绍另外一种方法。

--查看锁信息
create table #t(req_spid int,obj_name sysname)

declare @s nvarchar(4000)
,@rid int,@dbname sysname,@id int,@objname sysname

declare tb cursor for
select distinct req_spid,dbname=db_name(rsc_dbid),rsc_objid
from master..syslockinfo where rsc_type in(4,5)
open tb
fetch next from tb into @rid,@dbname,@id
while @@fetch_status=0
begin
set @s=‘select @objname=name from [‘[email protected]+‘]..sysobjects where [email protected]‘
exec sp_executesql @s,N‘@objname sysname out,@id int‘,@objname out,@id
insert into #t values(@rid,@objname)
fetch next from tb into @rid,@dbname,@id
end
close tb
deallocate tb

select 进程id=a.req_spid
,数据库=db_name(rsc_dbid)
,类型=case rsc_type when 1 then ‘NULL 资源(未使用)‘
when 2 then ‘数据库‘
when 3 then ‘文件‘
when 4 then ‘索引‘
when 5 then ‘表‘
when 6 then ‘页‘
when 7 then ‘键‘
when 8 then ‘扩展盘区‘
when 9 then ‘RID(行 ID)‘
when 10 then ‘应用程序‘
end
,对象id=rsc_objid
,对象名=b.obj_name
,rsc_indid
from master..syslockinfo a left join #t b on a.req_spid=b.req_spid

go
drop table #t

时间: 2024-11-10 00:52:31

SQL超过锁请求的相关文章

SQL SERVER错误:已超过了锁请求超时时段。 (Microsoft SQL Server,错误: 1222)

在SSMS(Microsoft SQL Server Management Studio)里面,查看数据库对应的表的时候,会遇到"Lock Request time out period exceeded.(Microsoft SQL Server, 错误1222)",对应的中文错误提示为"已超过了锁请求超时时段. (Microsoft SQL Server,错误: 1222)",如下截图所示,不管是用一般权限的账号还是具有sysadmin角色的登录名都是如此. 这

SQL Server &#39;已超过了锁请求超时时段&#39; 问题解决方法

SQL 有时遇到 已超过了锁请求超时时段. (Microsoft SQL Server,错误: 1222) 这个错误,刷新以后,右击某张表或者库,发现里面的表全部消失了 或者查询不到. 这是因为 sql进程死锁,资源被抢占,要解决这个问题,得杀死关闭 死锁的进程,下面介绍解决方案: 杀死进程的前提是找到 那个死锁的进程 , SELECT blocking_session_id '阻塞进程的ID', wait_duration_ms '等待时间(毫秒)', session_id '(会话ID)'

已超过了锁请求超时时段。 (Microsoft SQL Server,错误: 1222)

操作SQLServer数据库时,遇到这样的问题:已超过了锁请求超时时段. (Microsoft SQL Server,错误: 1222) 经过查找材料了解为资源抢占,照成死锁,杀死进程就OK了,具体操作如下: select spId from master..SysProcesses where db_Name(dbID) = '数据库名称' and spId <> @@SpId and dbID <> 0 上面语句是获取进程ID,下面就是根据ID杀死相应进程 exec ('Kil

已超过了锁请求超时时段。(MicrosoftSQLServer,错误:1222)

操作SQLServer数据库时,遇到这样的问题:已超过了锁请求超时时段. (Microsoft SQL Server,错误: 1222) 经过查找材料了解为资源抢占,照成死锁,杀死进程就OK了,具体操作如下: select spId from master..SysProcesses where db_Name(dbID) = '数据库名称' and spId <> @@SpId and dbID <> 0 上面语句是获取进程ID,下面就是根据ID杀死相应进程 exec ('Kil

sqlserver 已超过了锁请求超时时段 1222错误

今天在SSMS(Microsoft SQL Server Management Studio)里面,点击左侧的资源管理器,查看数据库对应的表的时候,会遇到"Lock Request time out period exceeded.(Microsoft SQL Server, 错误1222)",对应的中文错误提示为"已超过了锁请求超时时段. (Microsoft SQL Server,错误: 1222)". 这是死锁引起的,执行以下语句 select * from

SQL Server 锁

锁是一种防止在某对象执行动作的一个进程与已在该对象上执行的其他进行相冲突的机制.也就是说,如果有其他人在操作某个对象,那么你旧不能在该对象上进行操作.你能否执行操作取决于其他用户正在进行的操作. 通过锁可以防止的问题 锁可以解决以下4种主要问题: 脏读 非重复性读取 幻读 丢失更新 1.脏读 如果一个事务读取的记录是另一个未完成事务的一部分,那么这时就发生了脏读.如果第一个事务正常完成,那么就有什么问题.但是,如果前一个事务回滚了呢,那将从数据库从未发生的事务中获取了信息. 2.非重复性读取 很

SQL Server 磁盘请求超时的833错误原因分析以及解决

本文出处:http://www.cnblogs.com/wy123/p/6984885.html 最近遇到一个SQL Server服务器响应极度缓慢,并且出现客户端请求报错的情况,在数据库中的errorlog中出现磁盘请求超过一定时间才完成的error消息.对于此类问题,到底是存储系统或者磁盘的故障,还是SQL Server 自己的问题,亦或是应用程序引发的呢?又要如何解决?本文将对引起此问题的某一方面的因素进行简单的分析,但是无法涵盖所有潜在的可能性,因此遇到类似问题还要做具体的分析. SQL

lock(1)——创建及更新表过程中SQL SERVER锁资源分配情况

锁应该说是由关系型数据库ACID(Atomicity,Consistency,Isolation,Durability)特性而引出的. 以下将测试在创建及更新表过程中SQL Server锁资源分配情况 获取当前会话的事务隔离级别:DBCC USEROPTIONS 测试环境:SQL SERVER 2008 R2 read committed隔离级别下 创建表 当我们只是打开一个SSMS查询窗口,选择数据库为master和tempdb时,没有任何锁产生,当我选择其他数据库,sql server就会在

MDL--元数据锁的锁请求与锁等待+元数据锁类对象

1 元数据锁的锁请求与锁等待 元数据锁在MySQL Server层,按照锁的状态被细分为两种,一种是已经施加的锁,一种是等待施加的锁即锁请求,这样被区分的原因,如MySQL对"class MDL_request"的代码注释作了解释: /** A pending metadata lock request. A lock request and a granted metadata lock are represented by different classes because the