在大型数据库系统中,出现死锁问题后具体的解决办法(100分)

  • 主题发起人 主题发起人 王寒松
  • 开始时间 开始时间

王寒松

Unregistered / Unconfirmed
GUEST, unregistred user!
比如在SQL SERVER中,如果出现了两个事务争用表
CLIENT端和SERVER端应该有那些措施?(Server端使用存储过程)
(请详细些好么)
 
SERVER:
1。按一定的次序加锁(才不会死锁!!!)
2,数据库有一定的容余度(不至于争强资源!!!)
3。存储过程能提交的竟快提交,(别占着毛坑呗!)
4。控制枷锁的粒度!(页,表,行锁)
client:
没听说有办法,告你一个招,把界面搞得多多,让他一分钟做不了几笔业务,
那哪会天天争东西吃呢!(玩笑!)
 
多加Commit
 
可以尝试使用MIDAS技术进行开发。这样,就可能没有锁的烦恼。
 
我想你碰到的问题和我的一样,这种问题不但在SQL Server
上存在,同出一宗的Sybase也一样有这个问题。产生这种阻
塞问题的原因要从SQL Server的Cursor和锁机制说起:
对于记录数目较多的查询或TTable(在Delphi中TTable也是
一种查询)由于效率原因,SQL Server并不能够一次返回所有
的记录给Delphi, 而是打开了一个Cursor,对数据库遍历。
在不能够一次返回所有记录的情况下,SQL Server放了一个
共享锁在Table上。然而毛病就出在这里,SQL Server的锁机
制是页锁,一次将整整一页的记录同时锁住(这也是SQL Server
效率比Interbase和Oracle等高的原因,但同时在并发度上带来
了巨大的影响),这样但其他进程甚至当前进程本身需要修改
这一页的记录情况下,就不能够顺利实现,而产生了阻塞现象。
为了解决这个问题,我在Internet上花了不少时间,可惜还是
没有真正的答案,只能够给你提供以下一些提示:
1.绝对不要用TTable
2.将TQuery的查询结果局限在一个较小的范围以内,或着在
Query的Select后加上NOLOCK,避免产生锁,另外用一个
Query进行修改。
3.或者在TQuery打开以后,使用FetchAll将所有记录取回本地。
4.放弃SQL Server,而采用Oracle, DB2, Interbase等采取行
级锁机制的DBMS。

没了。
 
Hi,各位关于这个问题,我刚忙完,向各位推荐:

1.《Delphi 3.0从入门到精通》李维著
ISBN 7-80144-121-4
宇航出版社出版发行

2.http://www.kallista.com/techpapers.htm

3.讨论组:forums.inprise.com
 
我的建议,cpp和Delphi一人五十分,我无法实现此分配方式,
请yysun帮忙。

理由:cpp给出从数据库原理的角度看待这一问题的解决办法;
Delphi提供了具体技术上的参考和解决方式。
 
后退
顶部