教程学院
图像设计 多媒体类 机械制图 办公软件 操作系统 系统编程 网站编程 网页制作 数据库类 网络路由 网络工程 网络安全 考试认证
firefox火狐浏览器下载
酷网学院
CAD
AutoCad Cam350 ProEngineer GCcam MATLAB Unigraphics SolidWorks CAXA Solid3000 Cimatron EdgeCAM
系统
安全 防火墙 病毒 WinXP Win2003 Vista
数据库
编程
网络
编程设计
  当前位置: 库库中文网 · 数据库类教程 · MSSQL教程 · MsSql综合技巧

sqlserver 进程老是被锁 该怎么办?

 
学院最新推荐文章
PS教程推荐
 
『sqlserver 进程老是被锁 该怎么办?』如果文章有大量图片,显示会较慢,请等待图片下载完成
 
点击数: 更新时间:2008-7-28 
我用   delphi   写的管理软件   后台用的是   sqlserver2000   但是发现sqlserver   数据库的进程在使用过程中经常被锁   导致程序无法使用   只有打开数据库的企业管理器   去解锁。  
我查看了一下数据库   表之间有一些关联关系   另外就是   客户提交数据之后用存储过程来执行的   看了一下存储过程还蛮长的   我自己的分析可能是两个以上的用户同时提交事务后   存储过程执行的时候导致语句冲突出现的问题   但我不敢确信是否这个原因导致进程被锁的     不知各位专家有什么高见

                                                                                                                      小弟这里感谢了

这个问题第1个回答:
在联机事务处理(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系统时,应该根据应用系统的具体情况,依据上述原则对系统分别优化,为开发一套高效、可靠的应用系统打下良好的基础。          
    //摘自计算机世界
这个问题第2个回答:
有道理
这个问题第3个回答:
mark

】【关闭窗口
·上页:
·下页:
相关文章
 
     数据库类教程 - MsSql综合技巧
普通教程sql server 2000,从另一台服务器
普通教程往SQL server2000中导入数据出错
普通教程查询疑难--请各位大侠帮忙
普通教程怎么样判断数据库中地一个表是否
普通教程时间类型转换
普通教程问一个弱弱地疑难,还是excel导
普通教程这句sql语句出错,怎么样修改才
普通教程SQL语句排错,求正解。
普通教程传说中最菜地疑难
普通教程关于insert触发器
普通教程在线等,大家进来帮帮忙
advertisement
关于站点 - 广告服务 - 联系我们 - 版权隐私 - 免责声明 - 合作伙伴 - 程序支持 - 网站地图 - 返回顶部
网站文本地图
版权所有:库库中文 2005-2007 欢迎各种媒体转载我们的原创作品[转载请注明出处]
copyright © 2005-2008 www.QQGB.com online services. all rights reserved. 蜀ICP备05015578
Template designed by Virus. Optimized for 1024x768 to Firefox,Opera and MS-IE6. Site powered by EQL.
红盾
热爱电脑,热爱生活
拥有电脑,拥有生命
让我们享受拥有电脑的时光