的锁,由于客户系统的数据库死锁引起了终端不能正常运行,出错的信息就是” Java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]事务(进程 ID 69)与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品。请重新运行该事务。”这也是大多数用户遇到过的问题了,谈谈自己处理问题的方式.

 

的存储过程时,其它客户端并发的执行其它的功能,并且这个些功能中用到相同的表而引起的死锁,关于此方面可以在网上查一下,有详细的说明.此并发应该是一直存在的,一直没有反馈此问题.这次系统升级,数据迁移后,原来6G的内容变成11G,由于增加了一些表,或添加一些字段,但是数据库文件成倍增加,还不清楚是本来就这么大,还是别的什么原因.有待于查找.

 

    此存储过程中,包含了太多的业务,以至于有许多INSERT…SELECT,UPDATE…SELECT这样的语句,根据业务的完整性对此存储过程添加了事务,而且是一个大的事务,因为所有的语句都包含在里面了,如果有一条语句执行不成功,则事务回滚.这是添加事务的想法,但是每一并发执行时就出错了死锁的错误信息,且所有终端死掉.后来去掉了这个存储过程里的事务,对于此功能的影响不大.去掉之后再并发模拟测试时,终端不死掉了,也没有那样的死锁的错误信息了,但是卡机,等此功能结束后其它功能才可用,但是以前也是这种方式就没有这样的情况,是不是和改变数据库表结构有关系呢?这个想法需要求证.卡机时,让测试人员执行了以下的存储过程,查到了卡机是由于SQL执行时堵塞引起的.这个存储过程还是很有用的,在网上找的,贴上来,供参考.

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[sp_who_lock]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[sp_who_lock]
GO
 
use master
go
create procedure sp_who_lock
as
begin
declare @spid int,@bl int,
ctionCountOnEntry int,
nt int,
roperties int,
r int
 
who (
,1),
        spid smallint,
        bl smallint)
 
 
who(spid,bl) select 0 ,blocked
es where blocked>0 ) a 
ect * from (select * from sysprocesses where blocked>0 ) b 
spid)
ed from sysprocesses where blocked>0

 

 

-- 找到临时表的记录数

roperties = Count(*),@intCounter

who

 

 

roperties=0

现在没有阻塞和死锁信息' as message

 

-- 循环开始

while @intCounter <= @intCountProperties

begin

-- 取第一条记录

       

select @spid = spid,@bl = bl
who where Id = @intCounter 
        begin

引起数据库死锁的是: '+ CAST(@bl AS VARCHAR(10)) + '进程号,其执行的SQL语法如下'

进程号SPID:'+ CAST(@spid AS VARCHAR(10))+ '被' + '进程号SPID:'+ CAST(@bl AS VARCHAR(10)) +'阻塞,其当前进程执行的SQL语法如下'

  DBCC INPUTBUFFER (@bl )

 

-- 循环指针下移

r = @intCounter + 1
end
 
 
drop table #tmp_lock_who
 
return 0
end