数据库死锁,大家来看看
数据库记录有200w条,有索引,存储过程对表执行delete/insert/update操作时,特别慢。
监控发现有死锁情况发现,象这种情况怎么解决????
问题点数:0、回复次数:18Top
1 楼NinGoo(http://www.NinGoo.net)回复于 2005-01-03 22:40:18 得分 0
死锁得进程执行的是哪些SQL语句?Top
2 楼hai2003xp(古井小调)回复于 2005-01-03 23:06:22 得分 0
因為你對數據的操作量太多了,所以用的時間當然要多Top
3 楼baddot(小不点)回复于 2005-01-04 00:05:03 得分 0
我需要解决的办法。请大家献技Top
4 楼nsqsmile(阿南)回复于 2005-01-04 02:00:30 得分 0
1)看一下是否是有的事务持续时间太长了,是否有整批提交或回滚的,改为单条
2)其他事务是否有需要用户相应后才提交或回滚得情况Top
5 楼zjcxc(邹建)回复于 2005-01-04 08:17:13 得分 0
解决死锁不是凭三两句话或几个设置可以搞定的
要解决死锁,首先要分析死锁产生的原因,再根据原因,结合实际情况,考虑是修正业务处理方案,还是修正数据处理方案,还是提高硬件配置等方法来解决
如果仅仅是简单地几个设置之类就能解决问题,就不会存在死锁这个问题了.Top
6 楼zjcxc(邹建)回复于 2005-01-04 08:17:51 得分 0
常规分析方法:
死锁减至最少
虽然不能完全避免死锁,但可以使死锁的数量减至最少。将死锁减至最少可以增加事务的吞吐量并减少系统开销,因为只有很少的事务:
回滚,而回滚会取消事务执行的所有工作。
由于死锁时回滚而由应用程序重新提交。
下列方法有助于最大限度地降低死锁:
按同一顺序访问对象。
避免事务中的用户交互。
保持事务简短并在一个批处理中。
使用低隔离级别。
使用绑定连接。
按同一顺序访问对象
如果所有并发事务按同一顺序访问对象,则发生死锁的可能性会降低。例如,如果两个并发事务获得 Supplier 表上的锁,然后获得 Part 表上的锁,则在其中一个事务完成之前,另一个事务被阻塞在 Supplier 表上。第一个事务提交或回滚后,第二个事务继续进行。不发生死锁。将存储过程用于所有的数据修改可以标准化访问对象的顺序。
避免事务中的用户交互
避免编写包含用户交互的事务,因为运行没有用户交互的批处理的速度要远远快于用户手动响应查询的速度,例如答复应用程序请求参数的提示。例如,如果事务正在等待用户输入,而用户去吃午餐了或者甚至回家过周末了,则用户将此事务挂起使之不能完成。这样将降低系统的吞吐量,因为事务持有的任何锁只有在事务提交或回滚时才会释放。即使不出现死锁的情况,访问同一资源的其它事务也会被阻塞,等待该事务完成。
保持事务简短并在一个批处理中
在同一数据库中并发执行多个需要长时间运行的事务时通常发生死锁。事务运行时间越长,其持有排它锁或更新锁的时间也就越长,从而堵塞了其它活动并可能导致死锁。
保持事务在一个批处理中,可以最小化事务的网络通信往返量,减少完成事务可能的延迟并释放锁。
使用低隔离级别
确定事务是否能在更低的隔离级别上运行。执行提交读允许事务读取另一个事务已读取(未修改)的数据,而不必等待第一个事务完成。使用较低的隔离级别(例如提交读)而不使用较高的隔离级别(例如可串行读)可以缩短持有共享锁的时间,从而降低了锁定争夺。
使用绑定连接
使用绑定连接使同一应用程序所打开的两个或多个连接可以相互合作。次级连接所获得的任何锁可以象由主连接获得的锁那样持有,反之亦然,因此不会相互阻塞。
Top
7 楼lxysjl(流星雨)回复于 2005-01-04 09:03:37 得分 0
MARKTop
8 楼hanwen(汉文)回复于 2005-01-04 10:02:58 得分 0
markTop
9 楼hglhyy(為人民币服务!)回复于 2005-01-04 13:09:38 得分 0
上面说得对,首先要分析死锁是怎么产生的,再对症下药,采取措施Top
10 楼U2U2U2U2(数据也疯狂)回复于 2005-01-04 18:12:40 得分 0
大家说的都有道理Top
11 楼feeling_68(随风)回复于 2005-01-17 19:44:28 得分 0
大家说的都有道理。。。
用类似于PV开关的东东,也许能在某些时候有点用^_^Top
12 楼didoleo(冷月无声)回复于 2005-01-17 22:44:24 得分 0
学习,收藏之!Top
13 楼warren1999(warren1999)回复于 2005-01-28 12:46:04 得分 0
markTop
14 楼hai2003xp(古井小调)回复于 2005-01-28 13:03:42 得分 0
用事務處理呀!Top
15 楼hglhyy(為人民币服务!)回复于 2005-01-28 15:09:01 得分 0
转:
中断某数据库的所有连接来解锁:
use master
go
create proc killspid (@dbname varchar(20))
as
begin
declare @sql nvarchar(500),@temp varchar(1000)
declare @spid int
set @sql='declare getspid cursor for
select spid from sysprocesses where dbid=db_id('''+@dbname+''')'
exec (@sql)
open getspid
fetch next from getspid into @spid
while @@fetch_status < >-1
begin
set @temp='kill '+rtrim(@spid)
exec(@temp)
fetch next from getspid into @spid
end
close getspid
deallocate getspid
end
--用法
use master
exec killspid '数据库名'
可以用sp_who来查看死锁情况,blk字段不为0时出现死锁,用kill杀掉。
Top
16 楼panjinfu80(天蓝水晶)回复于 2005-01-28 19:11:42 得分 0
有道理!!Top
17 楼zhongxin799(台风)回复于 2005-01-28 20:08:43 得分 0
学习Top
18 楼631799(杭州工人)回复于 2005-01-28 21:19:56 得分 0
一网打尽Top




