一个关于锁的问题,请邹健,大力以及其他朋友帮看看

BenZ004 2004-04-29 09:53:07
首先谢谢上次我关于oracle的问题,得到邹健,大力还有一位朋友的热心关注。
这次是关于SQL的锁的问题。

我有个程序运行起来后,经常会出现一堆锁和一堆同一时间的进程,在进程里查看显示blocked都是0的,
而且进程的状态是sleeping,也没有正在阻塞和被阻塞的,显示都为0。

这应该不是死锁吧。可是这样的问题导致SQL连接池满以至连接不上去。

请问这会是由于怎么样的情况和原因而导致的呢?
该从什么地方着手去查看和解决?

注:我程序里的连接数据库完后都关闭了的。最近一直忙的要命,头很昏,因为是好几个项目一起进行,看程序看的头都大了,思路也混乱了,所以请朋友们帮看看。特别是邹健,大力,上次你们的热心让我很感动。

...全文
114 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
BenZ004 2004-05-12
  • 打赏
  • 举报
回复
邹建人呢??
cqlyzz 2004-05-03
  • 打赏
  • 举报
回复
关注
BenZ004 2004-04-30
  • 打赏
  • 举报
回复
对了,我们的SP3已经装了的
BenZ004 2004-04-30
  • 打赏
  • 举报
回复
好了,现在我使用了有权限的帐号在跟踪。可是我不清楚什么信息是对我有用的啊:)
BenZ004 2004-04-30
  • 打赏
  • 举报
回复
我家里有事,我回家去啦。5月份再见~!
zjcxc 2004-04-29
  • 打赏
  • 举报
回复
OK,明天再探讨
BenZ004 2004-04-29
  • 打赏
  • 举报
回复
好的,我明天去试试,因为现在我没有权限。我们的数据库服务器是由网管负责的,我的帐号不能跟踪。

因为比较急,希望明天能看到你在这继续帮助我。谢谢!

我先回去了,你注意休息,保重身体!
zjcxc 2004-04-29
  • 打赏
  • 举报
回复
---那你在服务器上设置跟踪,看具体是由那些操作产生的:

开始--程序--MS SQLSERVER
--事件探察器(SQL Profiler)
--文件
--新建
--设置跟踪的项目...
--然后数据库的调用情况就会显示出来
BenZ004 2004-04-29
  • 打赏
  • 举报
回复
我是直接用的SQL语句,没有用事务,就是怕用事务会引起一些错误。
BenZ004 2004-04-29
  • 打赏
  • 举报
回复
恩,邹建你的那个方法我用过了的。就是因为没有,所以我才觉得它们不是死锁。而且他们的blocked都是0,状态都是sleeping。

关于补丁我不知道我们网管有没有装,估计应该装了的,明天我去问问。
zjcxc 2004-04-29
  • 打赏
  • 举报
回复
类似这样的语句
begin tran
insert 表 ...


注意后面没有事务提交/回滚的语句,那么这个进程将一直处理等待状态.
只有另一个语句需要操作表时,死锁才会发生.
BenZ004 2004-04-29
  • 打赏
  • 举报
回复
你的意思是我的程序新开个窗口再进行一个查询,这样会导致死锁吗?

为什么会同一个时间SQL里出现同样的一堆进程啊?

它们的spid都上100了,现在服务器里有100多个锁,他们是依次增加的
zjcxc 2004-04-29
  • 打赏
  • 举报
回复
SQL补丁的补丁很重要,没有安装的话先装上:

'全部补丁的位置
http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&FamilyID=9032f608-160a-4537-a2b6-4cb265b80766

'应该安装的补丁sql 2000 sp3
http://download.microsoft.com/download/d/d/e/dde427eb-0296-4eac-a47c-d11a66b03816/chs_sql2ksp3.exe
zjcxc 2004-04-29
  • 打赏
  • 举报
回复
--如果真是死锁,用这个存储过程可以查询出来并终止掉它

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

/*--处理死锁

查看当前进程,或死锁进程,并能自动杀掉死进程

因为是针对死的,所以如果有死锁进程,只能查看死锁进程
当然,你可以通过参数控制,不管有没有死锁,都只查看死锁进程

感谢: caiyunxia,jiangopen 两位提供的参考信息

--邹建 2004.4--*/

/*--调用示例

exec p_lockinfo
--*/
create proc p_lockinfo
@kill_lock_spid bit=1, --是否杀掉死锁的进程,1 杀掉, 0 仅显示
@show_spid_if_nolock bit=1 --如果没有死锁的进程,是否显示正常进程信息,1 显示,0 不显示
as
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 @标志='死锁的进程' 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)
set @i=@i+1
end
select a.*,进程的SQL语句=b.EventInfo
from #t a join #t1 b on a.id=b.id
end
go
zjcxc 2004-04-29
  • 打赏
  • 举报
回复
它们的spid是否小于50?
zjcxc 2004-04-29
  • 打赏
  • 举报
回复
锁分死锁/和非死锁

--查询分析器中执行这样的语句,并不会发生死锁
create table tb(id int)

begin tran
insert tb select 1


--可是在新开一个窗口,执行下面的语句,死锁就发生了
select * from tb
BenZ004 2004-04-29
  • 打赏
  • 举报
回复
对了,还有个特征,那些一堆同时上来的进程,他们的网络地址都是不正常的,都显示为0000000000。不知道这个对大家有没有帮助。
BenZ004 2004-04-29
  • 打赏
  • 举报
回复
我现在回去了,头好昏~~~~~~,辛苦啊~!

明天过来和大家聊。

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧