3

我对 Interbase 7.5 中的事务有一个非常奇怪的问题,它似乎被卡住了。

我可以使用 IBConsole 跟踪问题 -> 右键单击​​ DB -> Performance Monitor -> Transactions

通常这个列表应该只显示几个活跃的事务。但是当我启动我的应用程序时,我得到了数百个活动事务(使用 Delphi 7 Interbase 组件的 apache 网络服务器的 Web 模块,例如 IBQuery、IBTransaction ......)

事务类型总是被列为快照,如果这是相关的。

我已经对所有 sql 语句进行了三次检查,但找不到任何会产生此类问题的东西......

有没有办法获取特定事务的 sql 语句?

非常欢迎任何其他关于如何找到此类问题的建议。

4

2 回答 2

2

活动 IBX 数据集始终需要活动事务。如果您没有活动数据集,请不要忘记提交所有活动事务。

如果您有活动的数据集,您可以将所有组件配置为使用相同的对象,您还可以通过和属性TIbTransaction配置唯一的 TIbTransaction 以在空闲超时期限后提交或回滚。IdleTimerDefaultAction

终止事务(通过手动或自动提交或回滚)将关闭所有链接的数据集(TIBQueryTIBTable)。

您可能想使用CommitRetainingorRollbackRetaining方法在不关闭相关数据集的情况下终止事务,但这可能会影响服务器的性能,我的建议是始终避免使用它。

如果你想改进你的应用程序,你应该考虑改变你的数据库连接层或引入一个内存中的数据集IBX,例如 Delphi 的TClientDataSet,它允许你检索数据并将其保留在内存中,同时关闭所有底层数据集(和事务),同时允许您使用传统的插入/追加/编辑/删除方法来修改数据,然后在新的短时事务中将更改应用到数据库。

于 2013-02-19T17:07:47.687 回答
2

有没有办法获取特定事务的 sql 语句?

是的,您可以从 SELECT 中选择TMP$STATEMENTS WHERE TRANSACTION_ID = ...。这是从记忆中,但应该让你开始。

在 IB Performance Monitor 中,您可以使用工具栏上的按钮从报表选项卡中找到交易。不记得您是否可以在该应用程序中采用其他方式。好久没写了!

于 2013-02-26T15:45:50.580 回答