数据库死锁,大家来看看

baddot 2005-01-03 10:33:52
数据库记录有200w条,有索引,存储过程对表执行delete/insert/update操作时,特别慢。
监控发现有死锁情况发现,象这种情况怎么解决????
...全文
519 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
warren1999 2005-01-28
  • 打赏
  • 举报
回复
mark
631799 2005-01-28
  • 打赏
  • 举报
回复
一网打尽
zhongxin799 2005-01-28
  • 打赏
  • 举报
回复
学习
panjinfu80 2005-01-28
  • 打赏
  • 举报
回复
有道理!!
hglhyy 2005-01-28
  • 打赏
  • 举报
回复
转:

中断某数据库的所有连接来解锁:
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杀掉。

hai2003xp 2005-01-28
  • 打赏
  • 举报
回复
用事務處理呀!
didoleo 2005-01-17
  • 打赏
  • 举报
回复
学习,收藏之!
feeling_68 2005-01-17
  • 打赏
  • 举报
回复
大家说的都有道理。。。
用类似于PV开关的东东,也许能在某些时候有点用^_^
baddot 2005-01-04
  • 打赏
  • 举报
回复
我需要解决的办法。请大家献技
hanwen 2005-01-04
  • 打赏
  • 举报
回复
mark
lxysjl 2005-01-04
  • 打赏
  • 举报
回复
MARK
zjcxc 元老 2005-01-04
  • 打赏
  • 举报
回复
常规分析方法:



死锁减至最少
虽然不能完全避免死锁,但可以使死锁的数量减至最少。将死锁减至最少可以增加事务的吞吐量并减少系统开销,因为只有很少的事务:

回滚,而回滚会取消事务执行的所有工作。


由于死锁时回滚而由应用程序重新提交。
下列方法有助于最大限度地降低死锁:

按同一顺序访问对象。


避免事务中的用户交互。


保持事务简短并在一个批处理中。


使用低隔离级别。


使用绑定连接。
按同一顺序访问对象
如果所有并发事务按同一顺序访问对象,则发生死锁的可能性会降低。例如,如果两个并发事务获得 Supplier 表上的锁,然后获得 Part 表上的锁,则在其中一个事务完成之前,另一个事务被阻塞在 Supplier 表上。第一个事务提交或回滚后,第二个事务继续进行。不发生死锁。将存储过程用于所有的数据修改可以标准化访问对象的顺序。



避免事务中的用户交互
避免编写包含用户交互的事务,因为运行没有用户交互的批处理的速度要远远快于用户手动响应查询的速度,例如答复应用程序请求参数的提示。例如,如果事务正在等待用户输入,而用户去吃午餐了或者甚至回家过周末了,则用户将此事务挂起使之不能完成。这样将降低系统的吞吐量,因为事务持有的任何锁只有在事务提交或回滚时才会释放。即使不出现死锁的情况,访问同一资源的其它事务也会被阻塞,等待该事务完成。

保持事务简短并在一个批处理中
在同一数据库中并发执行多个需要长时间运行的事务时通常发生死锁。事务运行时间越长,其持有排它锁或更新锁的时间也就越长,从而堵塞了其它活动并可能导致死锁。

保持事务在一个批处理中,可以最小化事务的网络通信往返量,减少完成事务可能的延迟并释放锁。

使用低隔离级别
确定事务是否能在更低的隔离级别上运行。执行提交读允许事务读取另一个事务已读取(未修改)的数据,而不必等待第一个事务完成。使用较低的隔离级别(例如提交读)而不使用较高的隔离级别(例如可串行读)可以缩短持有共享锁的时间,从而降低了锁定争夺。

使用绑定连接
使用绑定连接使同一应用程序所打开的两个或多个连接可以相互合作。次级连接所获得的任何锁可以象由主连接获得的锁那样持有,反之亦然,因此不会相互阻塞。

zjcxc 元老 2005-01-04
  • 打赏
  • 举报
回复
解决死锁不是凭三两句话或几个设置可以搞定的

要解决死锁,首先要分析死锁产生的原因,再根据原因,结合实际情况,考虑是修正业务处理方案,还是修正数据处理方案,还是提高硬件配置等方法来解决


如果仅仅是简单地几个设置之类就能解决问题,就不会存在死锁这个问题了.
U2U2U2U2 2005-01-04
  • 打赏
  • 举报
回复
大家说的都有道理
nsqsmile 2005-01-04
  • 打赏
  • 举报
回复
1)看一下是否是有的事务持续时间太长了,是否有整批提交或回滚的,改为单条

2)其他事务是否有需要用户相应后才提交或回滚得情况
hglhyy 2005-01-04
  • 打赏
  • 举报
回复
上面说得对,首先要分析死锁是怎么产生的,再对症下药,采取措施
hai2003xp 2005-01-03
  • 打赏
  • 举报
回复
因為你對數據的操作量太多了,所以用的時間當然要多
NinGoo 2005-01-03
  • 打赏
  • 举报
回复
死锁得进程执行的是哪些SQL语句?

34,593

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧