我不是一个伟大的VB程序员,但我的任务是维护/增强一个使用Sybase ASE作为后端的VB6桌面应用程序。这个应用程序大约有500个用户。
最近,我向这个应用程序添加了一些功能,它对数据库中的单个行执行额外的插入/更新操作,关键字段是事务编号,该字段是索引字段。被更新的表通常有大约6000条记录,因为当事务完成时,记录会被删除。部署后,该应用程序在用户报告性能缓慢之前工作了一天半。
最终,我们将性能问题追溯到数据库中的表锁,并不得不回滚到应用程序的前一个版本。第一天的使用是在星期一,这通常是系统使用非常繁重的一天,所以我很困惑为什么问题没有在那一天出现。
在已有的代码中,有一个启动Sybase事务的调用。在BeginTrans和CommitTrans之间的块中,有一个对更新数据库的DLL文件的调用。我将新代码放在DLL的一个类模块中。
我搞不懂为什么对单行执行一次插入/更新就会导致这样的问题,特别是在更改之前系统工作正常的情况下。有没有可能我暴露了一个更大的问题?或者我只需要重新考虑我的方法?
感谢任何遇到过类似情况并能提供建议的人。
发布于 2009-03-19 00:35:05
事实证明,罪魁祸首是出现在BeginTrans和CommitTrans调用范围内的一个消息框。拥有消息框的用户将在数据库上维护一个阻塞锁,直到他们确认该消息为止。解决方案是将消息框移出上述范围。
发布于 2009-03-15 21:41:20
如果没有您正在使用的SQL代码,我就无法理解完整的情况。
另外,如果是单个insert或update,为什么要使用事务?有没有可能会有很多用户尝试更新同一行?
发布于 2009-03-16 09:59:36
如果你同时发布了VB代码和SQL (如果可能的话,还有查询计划),这将是很有帮助的。但是,根据我们已有的信息,我将对表运行update statistics table_name,以确保查询计划是最新的。
如果您确定您的代码必须在事务内运行,您是否尝试过添加包含SQL的自己的事务块,而不是使用已有的事务块?
https://stackoverflow.com/questions/648572
复制相似问题