前往Shuct.Net首页

Shudepb PB反编译专家长时间以来,为业内同类软件事实上的唯一选择.细节,彰显专业.态度,决定品质.

关于PBKILLER的搜索

[100分悬赏] PB开发的程序访问SQL2000频繁出现阻塞或死锁 - CSDN论坛 - CSDN.NET --> 首页 论坛帮助 论坛牛人 论坛地图 CSDN > CSDN论坛 > PowerBuilder > 数据库相关 管理菜单 置顶 推荐 锁定 移动 编辑 删除 帖子加分 帖子高亮 结帖 发帖 回复 RobinBest [100分悬赏] PB开发的程序访问SQL2000频繁出现阻塞或死锁 [问题点数:100分,结帖人RobinBest] 不显示删除回复 显示所有回复 显示星级回复 显示得分回复 只显示楼主 收藏 RobinBest RobinBest 等级: 结帖率:94% 楼主 发表于: 2010-06-01 17:50:03 首先谢过进来的高手! 问题如标题所示,先说一下我这里的环境: PB开发的客户端,使用人数在50人左右,系统很复杂(主要是涉及的功能超级多,如果站在程序员的角度看,其实一点都不复杂),PB版本好像是6.5,不确定。 MS Sql2000做为数据库服务器,数据文件有4G左右,日志文件有3G。 现在的问题是,当客户端从SQL读取一些数据后,查看SQL server(执行sp_lock存储过程),会发现: 这个SPID会在被读取的数据表上,对某一个或几个PAG发出共享锁S (我们知道,SELECT执行时,其实发出S锁是正常的。但不正常的是:我的客户端明明已经成功读取到了数据了,那么当前SPID为何还保持着S锁不释放?了解SQL server的人都知道,被加上S锁后,其它SPID要等到S锁解除后才能进行更新操作,如果S锁一直保持,那就形成了阻塞,如果永远这样,那就是死锁了。) 进一步研究,我又发现:我的客户端并不是读取所有数据都是这样的。同时,即使是读取同一个数据表,查询条件不同,S锁释放与否也不同。说得更明显一点,读取的数据很多时(比如超过1000条记录),就有可能出现锁定某个PAG不释放的情况。 我用SQL事件探查器追踪客户端执行的SQL语句,然后把相同的语句放到SQL查询分析器里去执行,我发现,无论读取多少数据都不会出现S锁一直保持的情况。那么,问题肯定出在客户端程序内部了。 对于上面的现象,我猜想,是不是客户端程序有一种数据缓冲或者延迟的功能?就好比,客户端向SQL申请读取1000条记录,但它只获取500条记录,其余500条记录它给它加S锁,等到需要要时候再去获取。对于PB,我不是很熟悉,所以无法确定我的理解是否正确,或者还有其它的原因? 另外,客户端源程序我无法看到,所以也无法进一步研究,但我想,如果我上述的猜想成立,那么应该可以设置那个缓冲记录的数量。那么在哪里设置呢? 以上问题,烦请进来的高人能够解答,或者能提供一些解决问题的思路。 无论如何,都谢谢了。 (这个问题,我之前另外有一帖,烦请参考:http://topic.csdn.net/u/20100331/16/b9754dc0-4aa7-48e6-8d21-bcdedb2e9555.html) 分享到: 更多 对我有用[0] 丢个板砖[0] 引用 | 举报 | 编辑 删除 管理 回复次数:41 WYL20031722 WYL20031722 等级: 结帖率:0% #1 得分:5 回复于: 2010-06-01 18:07:09 可以用PBKILLER反编译你的pb做的exe程序,看看代码也许有帮助 对我有用[0] 丢个板砖[0] 引用 | 举报 | 编辑 删除 管理 gui41021 gui41021 等级: 结帖率:100% #2 得分:5 回复于: 2010-06-01 18:07:17 莫非SQLCA.AutoCommit =true 某程序段UPDATE没COMMIT,在等自动提交? 猜测而已,下班了,好运 对我有用[0] 丢个板砖[0] 引用 | 举报 | 编辑 删除 管理 new4everlau new4everlau 等级: 结帖率:88.89% 2 #3 得分:5 回复于: 2010-06-01 18:24:22 我顶,这个还真不好找!!! 对我有用[0] 丢个板砖[0] 引用 | 举报 | 编辑 删除 管理 xys_777 xys_777 等级: 结帖率:73.47% 2更多勋章 #4 得分:5 回复于: 2010-06-01 23:00:39 帮顶1,需要好好研究一下 对我有用[0] 丢个板砖[0] 引用 | 举报 | 编辑 删除 管理 RobinBest RobinBest 等级: 结帖率:94% #5 得分:0 回复于: 2010-06-02 15:36:47 没有高人出来指点一下呀? 对我有用[0] 丢个板砖[0] 引用 | 举报 | 编辑 删除 管理 fang3307 fang3307 等级: 结帖率:66.67% #6 得分:5 回复于: 2010-06-02 17:13:03 sqlca.lock='rc' 对我有用[0] 丢个板砖[0] 引用 | 举报 | 编辑 删除 管理 rabbit0802 rabbit0802 等级: 结帖率:100% #7 得分:5 回复于: 2010-06-02 17:44:01 如果 设了SQLCA.AutoCommit =false,执行任何sql语句后,包括datawindow 的相关执行 一定要commit 提交。马上释放掉事务。具体看一下数据库事务的概念,了解清楚sqlca.autocommit这个属性的原理。 对我有用[0] 丢个板砖[0] 引用 | 举报 | 编辑 删除 管理 sjlion sjlion 等级: 结帖率:100% #8 得分:5 回复于: 2010-06-02 18:08:10 http://topic.csdn.net/t/20040621/16/3110293.html http://topic.csdn.net/t/20040114/17/2664096.html 看来sql server 的问题可能大些。select 后边也加commit虽然没什么,不过那也要在程序里改啊,你现在程序都看不到也没什么办法。 对我有用[0] 丢个板砖[0] 引用 | 举报 | 编辑 删除 管理 sjlion sjlion 等级: 结帖率:100% #9 得分:5 回复于: 2010-06-02 18:16:30 http://www.medaili.info/browse.php?u=%20%20Oi8vd3d3LnN5YmFzZWJicy5jb20vc3liYXNlL3JlZGlyZWN0LnBocD90aWQ9Mjg5NCZnb3RvPWxhc3Rwb3N0&b=5 主要是这个: SQL Server本身对锁处理的问题。说到这里要谈一下锁的“粒度”。SQL Server具有多粒度锁定,允许一个事务锁定不同类型的资源。为了使锁定的成本减至最少,SQL Server自动将资源锁定在适合任务的级别。锁定在较小的粒度(例如行)可以增加并发但需要较大的开销,因为如果锁定了许多行,则需要控制更多的锁。锁定在较大的粒度(例如表)就并发而言是相当昂贵的,因为锁定整个表限制了其它事务对表中任意部分进行访问,但要求的开销较低,因为需要维护的锁较少。按照粒度增加顺序依次为:RID(行标识符)、键、页、扩展盘区、表、DB。一般情况下,使用SQL语句读取数据时(或使用数据窗口的Retrieve方法提取数据),用到的是页级或行级锁。也就是说它读完一页就会释放再读下一页。但如果对一些数据量比较大的表,出现的锁比较多,SQL Server会自动升级为表级锁,对整个表进行锁定。这也没什么问题。关键是在有些情况下(目前不知道是哪个版本解决的),SQL Server会升级表锁而用完不释放!这就会产生问题,遇到这种情况,可考虑给SQL Server打SP4补丁,经试验打上Sp4后不再出现读取数据锁表问题。 前几年老用SQL SERVER,从没遇到过楼主的问题,不过也巧了,我用的都是SP4,不知帖子里讲的对不对。现在改ORALCE了。 楼主自己试试吧 对我有用[0] 丢个板砖[0] 引用 | 举报 | 编辑 删除 管理 tianqingc tianqingc 等级: 结帖率:100% #10 得分:5 回复于: 2010-06-02 22:52:26 以前也遇到类似问题,有空聊聊QQ:541446322,初步估计是PB事务控制或者DW取数方法问题 对我有用[0] 丢个板砖[0] 引用 | 举报 | 编辑 删除 管理 sunfor sunfor 等级: 结帖率:100% #11 得分:0 回复于: 2010-06-19 08:47:24 关注。。。。。。。。 对我有用[0] 丢个板砖[0] 引用 | 举报 | 编辑 删除 管理 dawugui dawugui 等级: 结帖率:100% 3更多勋章 #12 得分:5 回复于: 2010-06-19 11:16:43 记住,更改数据后commit; 对我有用[0] 丢个板砖[0] 引用 | 举报 | 编辑 删除 管理 yo_yo2005 yo_yo2005 等级: 结帖率:100% #13 得分:0 回复于: 2010-06-20 16:12:26 看你有没有程序的源代码了 没源代码说什么都没用 对我有用[0] 丢个板砖[0] 引用 | 举报 | 编辑 删除 管理 zatoichi zatoichi 等级: 结帖率:0% #14 得分:5 回复于: 2010-06-21 09:35:59 以前也遇到过,反复检查程序没发现有不妥之处,甚至执行简单的一条select * from view在遇到特殊数据时也会锁表,后来在微软官网上发现有锁的bug说明,打上补丁就再没出现过问题了,楼主的问题虽然可能是程序问题,但首先应该打补丁后再看。 对我有用[0] 丢个板砖[0] 引用 | 举报 | 编辑 删除 管理 lucky_2005 lucky_2005 等级: 结帖率:83.33% #15 得分:0 回复于: 2010-06-21 16:29:27 没有源程序这个问题比较难查找,可以先升一下数据库补丁试试,看看是不是数据库的问题导致的 对我有用[0] 丢个板砖[0] 引用 | 举报 | 编辑 删除 管理 qj_198127 qj_198127 等级: 结帖率:96.3% #16 得分:0 回复于: 2010-06-21 17:07:35 肯定楼主哪儿没有回滚了 对我有用[0] 丢个板砖[0] 引用 | 举报 | 编辑 删除 管理 RobinBest RobinBest 等级: 结帖率:94% #17 得分:0 回复于: 2010-07-09 08:28:17 感谢楼上各位! 我查了下,我的SQL Server 版本是: Microsoft SQL Server 2000 - 8.00.2039 (Intel X86) May 3 2005 23:18:38 Copyright (c) 1988-2003 Microsoft Corporation Enterprise Edition on Windows NT 5.0 (Build 2195: Service Pack 4) 对我有用[0] 丢个板砖[0] 引用 | 举报 | 编辑 删除 管理 chengg0769 chengg0769 等级: 结帖率:100% #18 得分:5 回复于: 2010-07-10 20:40:05 搜了下以往的帖子。大致有: 1.数据窗口的Retrieveend事件的脚本中加COMMIT USING SQLCA http://topic.csdn.net/u/20081120/14/3d6322ba-8832-4eed-b755-a3d96e129468.html 16#说他解决了大面积死锁。 2.select ... from ... with(nolcok) 文档中称:nolock 不要发出共享锁,并且不要提供排它锁。当此选项生效时,可能会读取未提交的事务或一组在读取中间回滚的页面。有可能发生脏读。仅应用于 SELECT 语句。 如果你没源码。估计这个问题解决不了啦。因为你在查询分析器中执行很快完成并未发生锁表现象。那就一定是在程序端了。。。杯具。 对我有用[0] 丢个板砖[0] 引用 | 举报 | 编辑 删除 管理 chengg0769 chengg0769 等级: 结帖率:100% #19 得分:5 回复于: 2010-07-10 20:46:04 你也需要尝试一下1#的方法,用PBKILLER看看代码。6.5的程序估计看个八九不离十。分析一下。如果这种情况只是在很少的地方发生。比如一个窗口中,可以想想办法。比如是只读的,加上nolock。 如果是很早的系统,确实也没源码,甚至找不到开发的人了。而你又确认找到了问题点,可以联系我。帮你直接修改pbd。。(你自己有权利这样做的话) 对我有用[0] 丢个板砖[0] 引用 | 举报 | 编辑 删除 管理 chengg0769 chengg0769 等级: 结帖率:100% #20 得分:5 回复于: 2010-07-10 20:55:54 这个帖子: http://topic.csdn.net/u/20081212/00/7666e7f0-9d2c-405e-8a80-92cff9386677.html 9#的网友说得好像很详细,他能提出此问题,想必也是实践过并解决了他自己的问题。。我想你可以参考一下。 虽然无源码。你可以用pb6.5针对模仿你现在的程序做一个dw检索一下。。看看结果。 对我有用[0] 丢个板砖[0] 引用 | 举报 | 编辑 删除 管理 yyss66 yyss66 等级: 结帖率:100% #21 得分:5 回复于: 2010-07-11 18:30:47 打补丁 8.00.760 SQL Server 2000 SP3 !! 类似问题很多年前我遇到过,就是这么解决的。试试吧。 对我有用[0] 丢个板砖[0] 引用 | 举报 | 编辑 删除 管理 yyss66 yyss66 等级: 结帖率:100% #22 得分:5 回复于: 2010-07-11 18:35:22 对不起,没戏看你的版本号,已经SP4了,看来不是补丁的问题。六楼的办法很对。找到源码,加上sqlca.lock='rc',再编译一下,就好了。 对我有用[0] 丢个板砖[0] 引用 | 举报 | 编辑 删除 管理 wujiangfu wujiangfu 等级: 结帖率:100% #23 得分:0 回复于: 2010-07-11 19:33:57 后台数据库换成SQL SERVER2005看看! 对我有用[0] 丢个板砖[0] 引用 | 举报 | 编辑 删除 管理 chengg0769 chengg0769 等级: 结帖率:100% #24 得分:5 回复于: 2010-07-11 19:35:05 如果只增加sqlca.lock = 'rc'即可解决问题。我可以帮你做手术在pbd文件中增加这一句。如果确实没源码的话。 --------------------------------------------------- PB混淆器(5-12) http://chengg0769.download.csdn.net/ 对我有用[0] 丢个板砖[0] 引用 | 举报 | 编辑 删除 管理 xiaoguizl xiaoguizl 等级: 结帖率:0% #25 得分:0 回复于: 2010-07-12 23:02:37 该回复于2010-08-05 10:46:06被版主删除 编辑 删除 管理 sunfor sunfor 等级: 结帖率:100% #26 得分:0 回复于: 2010-07-13 10:06:14 引用 6 楼 fang3307 的回复:sqlca.lock='rc' 同意 对我有用[0] 丢个板砖[0] 引用 | 举报 | 编辑 删除 管理 KaedaRukawa KaedaRukawa 等级: 结帖率:100% #27 得分:0 回复于: 2010-07-13 10:53:57 关注这个问题 对我有用[0] 丢个板砖[0] 引用 | 举报 | 编辑 删除 管理 wag_enu wag_enu 等级: 结帖率:98.44% 56 #28 得分:0 回复于: 2010-07-13 11:11:30 mark... 对我有用[0] 丢个板砖[0] 引用 | 举报 | 编辑 删除 管理 ElayRain ElayRain 等级: 结帖率:50% #29 得分:0 回复于: 2010-07-15 16:39:22 关注这个问题 对我有用[0] 丢个板砖[0] 引用 | 举报 | 编辑 删除 管理 184270428 184270428 等级: 结帖率:100% #30 得分:5 回复于: 2010-07-15 17:31:52 Windows NT 5.0 (Build 2195: Service Pack 4) sp4系统和不是sql的sp4吧。 对我有用[0] 丢个板砖[0] 引用 | 举报 | 编辑 删除 管理 youzhi1007 youzhi1007 等级: 结帖率:91.53% #31 得分:5 回复于: 2010-07-15 17:41:26 表行锁改成页锁。 对我有用[0] 丢个板砖[0] 引用 | 举报 | 编辑 删除 管理 sbks sbks 等级: 结帖率:97.78% #32 得分:5 回复于: 2010-08-04 12:07:08 这种情况,十有八九是autocommit设成了false,然后在某个非select的操作后,没有及时的commit或rollback 我遇到的十次有十次是这个原因,现在都很习惯用false,然后先把commit或rollback写完全上去 对我有用[0] 丢个板砖[0] 引用 | 举报 | 编辑 删除 管理 wsgsjh wsgsjh 等级: 结帖率:50% #33 得分:0 回复于: 2010-08-04 19:54:27 没有提交 没说的 对我有用[0] 丢个板砖[0] 引用 | 举报 | 编辑 删除 管理 RobinBest RobinBest 等级: 结帖率:94% #34 得分:0 回复于: 2010-08-10 16:38:22 多谢楼上各位! 这段时间的观察,我又发现了一些新情况:先看下执行sp_blocker_pss80存储过程返回的信息: (这段信息显示:SPID68对457768688这个表的PAG 1:335560加了S锁,而SPID64要对这个表进行更新,但这一页有S锁,所以SPID68是等待状态。SPID68是阻塞源,SPID64是受害者.) 64 0 7 457768688 0 PAG 1:335560 IU GRANT 268911898 68 0 7 457768688 0 PAG 1:335560 S GRANT 268896852 64 0 7 457768688 0 PAG 1:335560 IX CNVT 268911898 64 0 7 457768688 0 RID 1:335560:26 U GRANT 268911898 我发现,每次出问题的都是同一个表(457768688),并且更神奇的是,每次都是同一个PAG(1:335560)。 这是一个重大的发现,这是否意味着457768688这个表有问题? 查了一下这个表的情况,3万条记录,16列,有一列索引,也没什么特别的。 高手呀,出来帮我分析一下吧,我先跪谢了! 对我有用[0] 丢个板砖[0] 引用 | 举报 | 编辑 删除 管理 hchjjun hchjjun 等级: 结帖率:92.31% #35 得分:0 回复于: 2010-08-10 20:29:26 select 后加一个unlock试试 对我有用[0] 丢个板砖[0] 引用 | 举报 | 编辑 删除 管理 RobinBest RobinBest 等级: 结帖率:94% #36 得分:0 回复于: 2010-08-16 09:52:33 大多数情况都是出在有人update时! 对我有用[0] 丢个板砖[0] 引用 | 举报 | 编辑 删除 管理 yjfan yjfan 等级: 结帖率:60% #37 得分:0 回复于: 2010-08-16 15:12:40 打sql2k的sp4补丁可以大大降低阻塞。 另外在费时的select后加个commit,好像也有效 对我有用[0] 丢个板砖[0] 引用 | 举报 | 编辑 删除 管理 leef_zh leef_zh 等级: 结帖率:100% #38 得分:0 回复于: 2010-08-16 16:54:52 试试这个 sql server 数据库引擎隔离级别 SQL-99 标准定义了下列隔离级别,Microsoft SQL Server Database Engine 支持所有这些隔离级别: 未提交读(隔离事务的最低级别,只能保证不读取物理上损坏的数据) 已提交读(数据库引擎 的默认级别) 可重复读 可序列化(隔离事务的最高级别,事务之间完全隔离) 实际测试发现,当设置sqlca.lock='RR'可重复读时,会出现死锁,其他三种不会。似乎PB10以上版本缺省是sqlca.lock='RR'才会造成死锁。 一般是用“RC”,低版本的PB用MSS连接时的默认级别,适用于大多数情况,当然还要看你的具体应用了 对我有用[0] 丢个板砖[0] 引用 | 举报 | 编辑 删除 管理 llwinter llwinter 等级: 结帖率:100% #39 得分:0 回复于: 2010-08-17 17:01:01 commit; 程序里少了这句 对我有用[0] 丢个板砖[0] 引用 | 举报 | 编辑 删除 管理 peixun peixun 等级: 结帖率:95% #40 得分:0 回复于: 2010-08-17 17:38:56 太常见的问题了.有原码好弄,没有原码,完蛋! 对我有用[0] 丢个板砖[0] 引用 | 举报 | 编辑 删除 管理 qlxzdn qlxzdn 等级: 结帖率:0% #41 得分:0 回复于: 2012-09-21 15:18:05 我也遇到过这种情况,就是SQL的问题,打上sp4立即就解决了。 对我有用[0] 丢个板砖[0] 引用 | 举报 | 编辑 删除 管理 管理菜单 置顶 推荐 锁定 移动 编辑 删除 帖子加分 帖子高亮 结帖 发帖 回复 写出你眼中的IE11 赢取新年好礼! 勇敢写出你的爱 赢莫文蔚签名大礼 2014年4月微软MVP申请开始了! 陈勇- 敏捷开发现状及发展之路 CSDN高校俱乐部 高校全新改版邀你来学习和挑战 本帖子已过去太久远了,不再提供回复功能。 核心技术类目 全部主题 Java VPN Android iOS ERP IE10 Eclipse CRM JavaScript Ubuntu NFC WAP jQuery 数据库 BI HTML5 Spring Apache Hadoop .NET API HTML SDK IIS Fedora XML LBS Unity Splashtop UML components Windows Mobile Rails QEMU KDE Cassandra CloudStack FTC coremail OPhone CouchBase 云计算 iOS6 Rackspace [关闭] [关闭]