当前位置:主页 > 澳门银河3980yh正文

澳门银河3980yh:解决死锁导致网站访问故障的具体实例(1)死锁

05月07日作者:黑曼巴


前段光阴完成了一个项目,然则现在该网站造访不了,真是愁闷,主机重澳门银河3980yh启之后,网站运行正常,考试测验了很多措施都没有办理,忧?。后来发明是数据库逝世锁造成的问题。 经由过程这个问题,我对数据库也钻研了一下,写一点相关常识。

逝世锁缘故原由:

提取查询数据响应数据,改动Stat表,都是改动同一条数据,进行大年夜数据量的操作,多用户同时操作时,造成数据库逝世锁和壅闭;

相关常识:

1、SQL逝世锁和壅闭。

2、逝世锁测试措施:法度榜样中将数据库操作,轮回操作1万次,打开多个窗口同时履行。

3、查找数据库逝世锁缘故原由的措施。

下面的SQL语句运行之后,便可以查找出SQLServer的逝世锁和壅闭的泉源。

use master

go

declare @spid int,@bl int

DECLARE s_cur CURSOR FOR

select 0 ,blocked

from (select * from sysprocesses where blocked>0 ) a

where not exists(select * from (select * from sysprocesses where blocked>0 ) b

wh澳门银河3980yhere a.blocked=spid)

union select spid,blocked 澳门银河3980yhfrom sysprocesses where blocked>0

OPEN s_cur

FETCH NEXT FROM s_cur INTO @spid,@bl

WHILE @@FETCH_STATUS = 0

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 )

FETCH NEXT FROM s_cur INTO @spid,@bl

end

CLOSE s_cur

DEALLOCATE s_cur

exec sp_who2

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,hos澳门银河3980yhtname,program_name,hostprocess,nt_domain,net_address,

s1=blocked,s2=1

from master..sysprocesses a where blocked0

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),@标志 varc澳门银河3980yhhar(10)

while @i

OK,多多指教!

最近关注

热点内容

更多