`

解决死锁导致网站访问故障的具体实例

阅读更多

前段时间完成了一个项目,但是现在该网站访问不了,真是郁闷,主机重启之后,网站运行正常,尝试了很多方法都没有解决,苦恼。后来发现是数据库死锁造成的问题。 通过这个问题,我对数据库也研究了一下,写一点相关知识。

死锁原因:

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

相关知识:

1、SQL死锁和阻塞。

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

3、查找数据库死锁原因的方法。

下面的SQL语句运行之后,便可以查找出SQLServer的死锁和阻塞的源头。

<ccid_nobr></ccid_nobr>
<ccid_code></ccid_code>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、查看当前进程,或死锁进程,并能自动杀掉死进程:

处理死锁

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

调用示例

<ccid_nobr></ccid_nobr>
<ccid_code></ccid_code>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
分享到:
评论

相关推荐

    大型WebSphere应用性能故障分析实例 (2010年)

    需要注意的是,由于企业应用系统具有高度复杂性,不同的系统架构和业务场景会对应不同的故障解决策略,因此在实际操作中需要根据具体情况制定个性化的优化方案。 从文献标识码、文章编号以及作者信息可知,本文的...

    软件工程中的故障排除与调试.pptx

    - **DNS解析故障**:解析失败导致网页无法打开或访问服务。 - **SQL语句错误**:检查SQL语句的语法错误,优化查询性能。 - **数据库死锁**:检查锁定资源,调整事务处理方式。 **数据库故障排除** - **数据库连接...

    ORA-01033ORACLE错误解决

    1. **数据库实例正在初始化或关闭过程中**:当Oracle数据库实例正在执行初始化或关闭操作时,其他尝试访问该实例的操作将被阻塞,直至当前操作完成。 2. **资源竞争或锁定**:在多用户环境中,如果某个操作长时间...

    松下PLC与上位机通信实例

    8. **安全注意事项**:在进行PLC通信时,要遵循安全规范,避免误操作导致设备故障。同时,保护好通信接口,防止未经授权的访问。 9. **扩展应用**:除了基本的读写操作,还可以实现更多功能,如远程监控、故障诊断...

    实战JAVA虚拟机 JVM故障诊断与性能优化

    《实战JAVA虚拟机—JVM故障诊断与性能优化》是一本深入探讨Java虚拟机(JVM)技术的书籍,旨在帮助开发者和系统管理员诊断并优化JVM相关的性能问题。本书内容丰富,涵盖了大量的实践案例,使得即便是初学者也能理解...

    超卖和分布式锁解决方案.docx

    这种方式虽然简单,但缺乏锁的超时机制,一旦程序在持有锁期间出现故障,可能会导致锁无法释放,形成死锁状态。 ##### 4.2 EXPIRE命令 为了解决死锁问题,可以在获取锁后使用`EXPIRE`命令为锁设置一个过期时间。...

    WebLogic宕机大全总结

    - **资源竞争**:多个线程同时访问同一资源,导致死锁或阻塞。 ##### 3. 排查步骤 - **Ping测试**:首先尝试ping挂起的WebLogic Server实例,以确认网络连接是否正常。 - **检查线程队列**:使用命令行工具查看执行...

    Struts线程安全

    在多线程环境中能够正确执行且不会导致数据错误或程序故障的代码称为线程安全的代码。如果不确保线程安全,可能会导致数据损坏、死锁、竞态条件等问题。 #### 2. 如何编写线程安全的代码? 为了编写线程安全的代码...

    sqlserver挂起修复软件

    SQL Server挂起问题通常指的是SQL Server服务在处理某些任务时突然变得无响应或者运行缓慢,导致用户无法正常访问数据库。这种情况可能由多种原因引起,包括但不限于资源争抢、内存不足、长时间运行的查询、死锁、...

    分布式锁与信号量.rar

    它解决了在无共享内存或单点故障下的并发问题,保证了不同节点间操作的互斥性。分布式锁常见的实现方式有基于数据库、基于缓存(如Redis)、基于Zookeeper等。例如,基于Redis的分布式锁可以通过设置过期时间防止...

    2008:操作系统(A)1

    16. **页面故障处理**:当进程试图访问不在内存中的页面时,会发生页面故障。操作系统会将被访问的页从磁盘读入内存,并进行相应的页面替换。 17. **设备作为文件操作的好处**:通过将外部设备模拟为文件,用户可以...

    redis分布式锁.zip

    分布式锁在IT行业中是解决多节点并发访问共享资源问题的关键技术,特别是在微服务架构和大数据处理场景中。Redis,作为一个高性能的键值存储系统,常被用来实现分布式锁,因其支持原子操作,如SETNX(设置如果不存在...

    广东工业大学操作系统试卷(2016.12期末复习必备)

    6. **死锁**:死锁是多个进程等待对方释放资源导致的僵局,了解死锁的四个必要条件、死锁的预防与避免策略、死锁的检测与恢复方法是重要的知识点。 7. **线程管理**:线程是轻量级进程,与进程相比,线程的创建和...

    数据业务工程师DB2入门指南

    - 解决方法:确认数据库实例用户的权限,并确保其能够访问裸设备。 - **1.4.15 如何让数据库支持中文字符集** - 方法:在创建数据库时,指定支持中文字符集的编码格式,如`GB18030`。 - **1.4.16 db2select * ...

    42_分布式锁是啥?对比下redis和zk两种分布式锁的优劣?.zip

    分布式锁是一种在分布式系统中实现同步访问资源的机制,它允许多个节点在同一时间对共享资源进行操作,而不会导致数据不一致或并发问题。在Java开发中,分布式锁的应用广泛,尤其是在微服务架构中,当服务间的通信...

    Oracle技术常见问题

    - **解决方案**:检查监听器状态,使用`lsnrctl status`命令,同时确保数据库实例正常,用`sqlplus / as sysdba`登录并尝试`startup`或`shutdown`。 3. **性能优化** - **问题**:数据库响应慢,查询效率低下。 ...

    分布式锁与信号量.md

    这种特性允许同一个进程多次请求同一把锁,有效防止了由于误操作而导致的死锁问题。 - **死锁预防**:为了避免死锁的发生,分布式锁通常会包含一些预防机制,比如设置锁的有效时间(超时)、支持锁的自动续期等。 - ...

    《操作系统》教学大纲.docx

    - 内存碎片:连续内存分配可能导致的空间浪费及其解决方案。 4. 文件系统: - 文件的概念:组织数据的逻辑单位,具有命名、结构、属性等特性。 - 文件的组织形式:顺序、链接、索引、哈希等结构。 - 文件的访问...

Global site tag (gtag.js) - Google Analytics