我们的SQL Server 7.0数据库经常在多人操作的情况下导致死锁(DeadLock),请教其原因及该如何避免和解决?

watermelon 2000-08-01 06:19:00
加精
我们的SQL Server 7.0数据库经常在多人操作的情况下导致死锁(DeadLock),请教其原因及该如何避免和解决?死锁(DeadLock)发生时,很长时间才有提示,并且select,Insert,delete,update都不能执行!

请帮帮我们吧!
...全文
596 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
昵称被占用了 2001-11-07
  • 打赏
  • 举报
回复
学习
skt985 2001-06-01
  • 打赏
  • 举报
回复
37329关注!
watermelon 2000-09-05
  • 打赏
  • 举报
回复
C++ Builder
watermelon 2000-09-05
  • 打赏
  • 举报
回复
CB
zcw 2000-09-02
  • 打赏
  • 举报
回复
你用的什么开发语言呀
p9 2000-08-22
  • 打赏
  • 举报
回复
解决方法1:把死锁检测时间提前,用如下方法:
set Lock_TimeOut tt,tt为要测定的时间,单位为毫秒.
解决方法2:并发在实际业务中是不可避免的,只能减少deadlock的可能。
如:保证每个应用访问表的顺序是一样的,等
qiuzhi 2000-08-22
  • 打赏
  • 举报
回复
我也曾经遇到过类似情况!
我采取的方法很简单,一方面调整所有的存储过程中访问(主要是insert,update,delete等)表的顺序一致。另一方面,尽量缩短事务长度~

其中,我觉得第一个比较重要!
我调整后,就几乎没有再死锁了!
祝你好运!
watermelon 2000-08-19
  • 打赏
  • 举报
回复
没有人再详细回答一下么?
zzh 2000-08-19
  • 打赏
  • 举报
回复
避免死锁的方法最简单的是把所有的基于事务的SQL程序都放入存储过程中,存储过程的性能优点在此处变得非常明显,因为与简单的提交的SQL语句相比较,存储过程使事务在一个极短的时间范围内就能完成。结果是事务锁定的持续时间大大地缩短了。这就减少了死锁发生的可能性,但如果在开发一个面向事务的应用程序,则应尽量使用支持访问存储过程及SQL专门的开发工具。
加速事务处理的另一种方法是避免使用从事务中返回的数据的查询。数据的读取将分配另外的读取锁定,这将延长修改锁定的持续时间并增加了死锁可能性。相反,显示定义的事务应当仅限于进行数据修改。
另外,可以使用乐观锁定使事务首先获得一独占锁定。例如:
begin tran
select new_id from keytab holdlock
update keytab se new_id=new_id+1
commit tran
qianxh 2000-08-19
  • 打赏
  • 举报
回复
1.死锁的原因在于两个事务对资源加锁的冲突,比如:
事务甲:锁住资源A->想锁资源B(此时资源B被事务乙锁住,必须等待释放)
在事务甲锁住资源A的同一瞬间:
事务乙:锁住资源B->想锁资源A(此时资源A被事务甲锁住,必须等待释放)
两个事务都在等待对方释放资源,好比两个人同时从独木桥的两端过桥,又互不相让;
2.除了按w102272所说优化以外,你可以检查并调整经常发生死锁的两个事务对表进行加锁的顺序;单纯的查询语句不要放在事务中处理。
3.本人曾仔细研究过事务嵌套及在任一层的提交或回滚对数据的影响,规律虽然记不起了,但却知道处理事务的方法,即:事务的提交或回滚均应在最外层,具体方法为:
create procedure StoredProcedure1
as
begin
declare @trncount int
select @trncount=@@trancount
begin transaction
.....
if @@error<>0
begin
if @trncount=0 rollback transactin
return -1
end

if @trncount=0 commit transaction
return 0
end

存储过程的调用也一样:
create procedure StoredProcedure2
as
begin
declare @trncount int,@ret int
select @trncount=@@trancount
begin transaction
.....
exec @ret=StoredProcedure1
if @ret<>0
begin
if @trncount=0 rollback transactin
return @ret
end

if @trncount=0 commit transaction
return 0
end
watermelon 2000-08-05
  • 打赏
  • 举报
回复
谢谢各位大虾!能不能更具体点!
直接教我用法!
wwwunix 2000-08-04
  • 打赏
  • 举报
回复
将页锁变为行锁。
w102272 2000-08-03
  • 打赏
  • 举报
回复
主要优化手段有三:
1、降低你的应用程序的加锁隔离级别,最好使用允许脏读的方式。RU
2、缩短事务的规模,或者在允许的情况下使用自动提交
3、优化HOT表的索引和访问方式
具体的细节我曾经在以前的帖子里头讨论过请自行查找。
suka 2000-08-03
  • 打赏
  • 举报
回复
没有做事务处理,select时,系统分配共享锁,不会产生共享冲突,
当insert,update,delete时,为独占锁。
最将在以上sql语句放在BEGIN TRANSACTION...COMMIT TRANSACTION 内

34,575

社区成员

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

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