pb8超级BUG,各位程序员小心

newskysoft 2002-12-03 05:54:17
代码很简单
SQLCA.DBMS = "MSS Microsoft SQL Server 6.x"
SQLCA.Database = "XXXX"
SQLCA.ServerName = "xxxx"
SQLCA.LogId = "sa"
SQLCA.AutoCommit = False
SQLCA.DBParm = "CommitOnDisconnect='No'"
connect using sqlca;

dw_1.dataobject="dw_test"//dw_test的数据源为一条select语句
dw_1.settransobject(sqlca)
dw_1.retrieve()

该段代码执行完毕后pb锁(共享锁)死retrieve出的表直到退出程序为止。
环境为pb8(9704),sql2000,但是该问题只在特定表特定数据下出现,所以各位不一定试得出来,但是日后遇见了千万要注意。最好在retrieve前改sqlca.autocommit=true,retrieve后改回false,注意事务控制!
...全文
43 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
llitcwl 2002-12-11
  • 打赏
  • 举报
回复
可在联接前考虑加一句
sqlca.lock='RU'
每次retrieve就commit很容易破坏客户端的大事务的
老吴子 2002-12-11
  • 打赏
  • 举报
回复
对于MS SQL Server建议采用与PFC相同的事务控制,即AutoCommit=true,更新时执行:
execute immediate "begin tran"
......
execute immediate "commit tran"
来处理。
himaernew 2002-12-07
  • 打赏
  • 举报
回复
如果用的数据库是SQL SERVER 2000, 则是SQL SERVER 2000的问题,打SP2后即可解决。我以前碰到过。
bcbhj 2002-12-07
  • 打赏
  • 举报
回复
是啊 我觉得是SQL SERVER的问题 它对自动提交很“感兴趣”哦
newskysoft 2002-12-07
  • 打赏
  • 举报
回复
'那个if判断的语句是被无限次paste的,偶尔改一下事务对象。这是一条规定。'
为什么不重写retrieve函数呢?
xrfei 2002-12-05
  • 打赏
  • 举报
回复
我有同感.我做的一个程序,在retrieve之后出现锁定.其它客户机无法访问数据库.后来在retrieve之后加一条commit ;问题解决.
realfool 2002-12-04
  • 打赏
  • 举报
回复
按照我们的规范,通常这样写:
li_rows=dw_1.retrieve()
if li_rows<0 then
messagebox('警告!','数据检索失败!',stopsign!)
rollback using sqlca;
else
commit using sqlca;
end if


那个if判断的语句是被无限次paste的,偶尔改一下事务对象。这是一条规定。
newskysoft 2002-12-04
  • 打赏
  • 举报
回复
我认为这是sqlserver的bug,一般情况下不会出现这个问题的,我用oracle多年从来没发现select执行完毕后会不解锁的!不可能要求程序员在每句select语句后都加一个事务控制语句的,因为从原则上说共享锁的事务级别较低,数据库应该自动释放的。不过pb的help里曾提过:一般情况下对于retrieve操作最好在retrieve前改sqlca.autocommit=true,完成后改回false,这样相当于提交了commit语句。不过这个问题不是死锁,不太同意 lgm(教主) 的说法,因为我们的程序很少会去显式的加锁
newskysoft 2002-12-04
  • 打赏
  • 举报
回复
经过仔细调试发现,这是sqlserver的问题,与pb无关。本来select应该是自动释放共享锁的,但是由于sqlserver未完成释放,所以出现问题
ice2water 2002-12-03
  • 打赏
  • 举报
回复
gz
xlhl 2002-12-03
  • 打赏
  • 举报
回复
commit
or
rollback
lgm 2002-12-03
  • 打赏
  • 举报
回复
我遇过,造成死锁,相关数据库瘫痪,必须重新启动服务才行!
后来跟踪锁的生成发现,无论那种SQL语句,执行完毕后,如果不执行commit或rollback,先前产生的锁就不会解锁,直到完全退出程序才释放.
虽然有些共享锁并存是合法的,但是当锁过多也同样会造成数据库当机.
这个大家在编程必须注意!
msf 2002-12-03
  • 打赏
  • 举报
回复
我也遇到过类似的问题.
后来重建表
am2000 2002-12-03
  • 打赏
  • 举报
回复
我好象碰到类似的情况,但还不能确认.
我一般只在更新和删除等SQL语句前加控制.
am2000 2002-12-03
  • 打赏
  • 举报
回复
真的吗?
jonseyc 2002-12-03
  • 打赏
  • 举报
回复
应该这样
SQLCA.DBMS = "MSS Microsoft SQL Server 6.x"
SQLCA.Database = "XXXX"
SQLCA.ServerName = "xxxx"
SQLCA.LogId = "sa"
SQLCA.AutoCommit = False
SQLCA.DBParm = "CommitOnDisconnect='No'"
connect using sqlca;

dw_1.dataobject="dw_test"//dw_test的数据源为一条select语句
dw_1.settransobject(sqlca)
dw_1.retrieve()

rollback;
888888888888 2002-12-03
  • 打赏
  • 举报
回复
OK!

752

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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