All articles| All Pictures| All Softwares| All Video| Go home page| Write articles| Upload pictures

Reading number is top 10 articles
ASP.NET2.0服务器控件之捕获回传事件_[Asp.Net教程]
动态网页PHP编程中八种常见的文件操作方式_[PHP教程]
解决无法显示javascript页面故障_JavaScript技术_编程技术
SQLServer7.0安装问题_[SQL,Server教程]
IIS中Sql,server数据库的安全问题_[SQL,Server教程]
ASP.NET2.0数据库入门之常见错误_[Asp.Net教程]
asp.net自动生成姓名拼音的代码_[Asp.Net教程]
c#远程获取网页内容_.net资料_编程技术
用户需要怎样的网站设计_研究探讨_seo学堂
让你的.NET程序兼容不同版本的Dll文件_[Asp.Net教程]
Reading number is top 10 pictures
这张图有两句话,你看出来了吗?
The money of more than 100 countries and regions16
Terrorist smile the largest human history an explosion2
NeedWallpaper12
Average female college students3
Sora aoi on twitter5
In 2013 hercules Arnold classic2
China's first snake village3
初五接财神啦!五路财神齐来到
The money of more than 100 countries and regions1
Download software ranking
Unix video tutorial15
WebService在.NET中的实战应用教学视频 → 第1集
传奇私服架设教程
Tram sex maniac 2 (H) rar bag18
I'm come from Beijing1
I'm come from Beijing2
Call Of Duty5
艳兽都市
Visual C++界面编程技术
The Bermuda triangle1
归海一刀 published in(发表于) 2014/2/1 0:21:38 Edit(编辑)
数据库死锁导致网站站点访问不了之解决方案_[SQL,Server教程]

数据库死锁导致网站站点访问不了之解决方案_[SQL,Server教程]

数据库死锁导致网站站点访问不了之解决方案_[SQL Server教程]

前段时间完成了一个项目,但是现在该网站访问不了,真是郁闷,主机重启之后,网站运行正常,“狗”(google)也放了,“csdn”也帖了,没有解决,苦恼,后来发现是数据库死锁造成的问题。 通过这个问题,我对数据库思索也小小研究了一下,写一点相关知识。

死锁原因:


提取查询数据相应数据,修改Stat表,都是修改同一条数据,进行大数据量的操作,多用户同时操作时,造成数据库死锁和阻塞;


相关知识:


1、SQL死锁和阻塞:http://searchdatabase.techtarget.com.cn/tips/275/2080775.shtml


2、死锁测试方法:程序中将数据库操作,循环操作1万次,打开多个窗口同时执行


3、查找数据库死锁原因的方法:http://www.51testing.com/html/57/785.html


下面的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
where a.blocked=spid)
union select spid,blocked from 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、查看当前进程,或死锁进程,并能自动杀掉死进程:http://www.5do8.com/blog/news.asp?id=363


/*--处理死锁


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


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


--邹建 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


OK,多多指教


来源:网络







添加到del.icio.us 添加到新浪ViVi 添加到百度搜藏 添加到POCO网摘 添加到天天网摘365Key 添加到和讯网摘 添加到天极网摘 添加到黑米书签 添加到QQ书签 添加到雅虎收藏 添加到奇客发现 diigo it 添加到饭否 添加到飞豆订阅 添加到抓虾收藏 添加到鲜果订阅 digg it 貼到funP 添加到有道阅读 Live Favorites 添加到Newsvine 打印本页 用Email发送本页 在Facebook上分享


Disclaimer Privacy Policy About us Site Map

If you have any requirements, please contact webmaster。(如果有什么要求,请联系站长)
Copyright ©2011-
uuhomepage.com, Inc. All rights reserved.