解决Sybase数据库死锁的方法

 http://topic.csdn.net/t/20011116/10/373324.html

1 楼killerdanny(堕落的瓦拉斯塔兹)回复于 2001-11-16 10:53:42 得分 24

解决Sybase数据库死锁的方法  
   
  人民银行吉林市中心支行科技处   刘志明      
  01-7-20   上午   10:11:30  
   
  --------------------------------------------------------------------------------  
     
   
  在联机事务处理(OLTP)的数据库应用系统中,多用户、多任务的并发性是系统最重要的技术指标之一。为了提高并发性,目前大部分RDBMS都采用加锁技术。然而由于现实环境的复杂性,使用加锁技术又不可避免地产生了死锁问题。因此如何合理有效地使用加锁技术,最小化死锁是开发联机事务处理系统的关键。    
  死锁产生的原因    
  在联机事务处理系统中,造成死机主要有两方面原因。一方面,由于多用户、多任务的并发性和事务的完整性要求,当多个事务处理对多个资源同时访问时,若双方已锁定一部分资源但也都需要对方已锁定的资源时,无法在有限的时间内完全获得所需的资源,就会处于无限的等待状态,从而造成其对资源需求的死锁。    
  另一方面,数据库本身加锁机制的实现方法不同,各数据库系统也会产生其特殊的死锁情况。如在Sybase   SQL   Server   11中,最小锁为2K一页的加锁方法,而非行级锁。如果某张表的记录数少且记录的长度较短(即记录密度高,如应用系统中的系统配置表或系统参数表就属于此类表),被访问的频率高,就容易在该页上产生死锁。    
  几种死锁情况及解决方法    
  清算应用系统中,容易发生死锁的几种情况如下:      
  ●   不同的存储过程、触发器、动态SQL语句段按照不同的顺序同时访问多张表;      
  ●   在交换期间添加记录频繁的表,但在该表上使用了非群集索引(non-clustered);      
  ●   表中的记录少,且单条记录较短,被访问的频率较高;    
  ●   整张表被访问的频率高(如代码对照表的查询等)。    
  以上死锁情况的对应处理方法如下:    
  ●   在系统实现时应规定所有存储过程、触发器、动态SQL语句段中,对多张表的操作总是使用同一顺序。如:有两个存储过程proc1、proc2,都需要访问三张表zltab、z2tab和z3tab,如果proc1按照zltab、z2tab和z3tab的顺序进行访问,那么,proc2也应该按照以上顺序访问这三张表。    
  ●   对在交换期间添加记录频繁的表,使用群集索引(clustered),以减少多个用户添加记录到该表的最后一页上,在表尾产生热点,造成死锁。这类表多为往来账的流水表,其特点是在交换期间需要在表尾追加大量的记录,并且对已添加的记录不做或较少做删除操作。    
  ●   对单张表中记录数不太多,且在交换期间select或updata较频繁的表可使用设置每页最大行的办法,减少数据在表中存放的密度,模拟行级锁,减少在该表上死锁情况的发生。这类表多为信息繁杂且记录条数少的表。    
  如:系统配置表或系统参数表。在定义该表时添加如下语句:    
  with   max_rows_per_page=1    
  ●   在存储过程、触发器、动态SQL语句段中,若对某些整张表select操作较频繁,则可能在该表上与其他访问该表的用户产生死锁。对于检查账号是否存在,但被检查的字段在检查期间不会被更新等非关键语句,可以采用在select命令中使用at   isolation   read   uncommitted子句的方法解决。该方法实际上降低了select语句对整张表的锁级别,提高了其他用户对该表操作的并发性。在系统高负荷运行时,该方法的效果尤为显著。    
  例如:    
  select*from   titles   at   isolation   read   uncommitted    
  ●   对流水号一类的顺序数生成器字段,可以先执行updata流水号字段+1,然后再执行select获取流水号的方法进行操作。    
  小结    
  笔者对同城清算系统进行压力测试时,分别对采用上述优化方法和不采用优化方法的两套系统进行测试。在其他条件相同的情况下,相同业务笔数、相同时间内,死锁发生的情况如下:    
  采用优化方法的系统:   0次/万笔业务;      
  不采用优化方法的系统:50~200次/万笔业务。    
  所以,使用上述优化方法后,特别是在系统高负荷运行时效果尤为显著。总之,在设计、开发数据库应用系统,尤其是OLTP系统时,应该根据应用系统的具体情况,依据上述原则对系统分别优化,为开发一套高效、可靠的应用系统打下良好的基础。    
  //摘自计算机世界Top

2 楼IronPromises(铁诺)回复于 2001-11-16 11:16:17 得分 24

 
  http://www.csdn.net/expert/Topic/15/15514.shtm  
  http://www.csdn.net/expert/Topic/23/23241.shtm  
   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值