3

Interbase 7.5 のトランザクションがスタックしているように見える非常に奇妙な問題があります。

IBConsole で問題を追跡できます -> DB を右クリック -> パフォーマンス モニター -> トランザクション

通常、このリストにはいくつかのアクティブなトランザクションのみが表示されます。しかし、アプリケーション (IBQuery、IBTransaction などの Delphi 7 Interbase コンポーネントを使用する Apache Web サーバー用の Web モジュール) を起動すると、数百のアクティブなトランザクションが発生します。

関連性がある場合、トランザクション タイプは常にスナップショットとして表示されます。

私はすでにすべてのSQLステートメントをトリプルチェックしましたが、そのような問題を引き起こすものは何も見つかりません...

特定のトランザクションの SQL ステートメントを取得する方法はありますか?

このような問題を見つける方法についての他の提案は大歓迎です。

4

2 に答える 2

2

アクティブなIBXデータセットには、常にアクティブなトランザクションが必要です。アクティブなデータセットがない場合は、すべてのアクティブなトランザクションをコミットすることを忘れないでください。

アクティブなデータセットがある場合は、すべてのコンポーネントが同じオブジェクトを使用するように構成できます。また、およびプロパティTIbTransactionを使用して、アイドルタイムアウト期間後にコミットまたはロールバックするように一意のTIbTransactionを構成することもできます。IdleTimerDefaultAction

トランザクションを終了すると(手動または自動でコミットまたはロールバックすることにより)、リンクされているすべてのデータセット(TIBQueryTIBTableなど)が閉じられます。

CommitRetainingまたはRollbackRetainingメソッドを使用して、関連するデータセットを閉じずにトランザクションを終了したくなるかもしれませんが、これはサーバーのパフォーマンスに影響を与える可能性があるため、常に使用しないことをお勧めします。

アプリケーションを改善したい場合は、データベース接続レイヤーを変更するか、メモリ内対応のデータセットを導入することを検討する必要があります。IBXたとえば、DelphiTClientDataSetを使用すると、データを取得して、基になるすべてのデータセットを閉じながらメモリに保持できます(およびトランザクション)、従来の挿入/追加/編集/削除メソッドを使用してデータを変更し、その変更を新しい短時間のトランザクションでデータベースに適用できるようにします。

于 2013-02-19T17:07:47.687 に答える
2

特定のトランザクションの SQL ステートメントを取得する方法はありますか?

はい、から選択できますTMP$STATEMENTS WHERE TRANSACTION_ID = ...。それは記憶からのものですが、始める必要があります。

IB パフォーマンス モニターでは、ツールバーのボタンを使用して、[ステートメント] タブからトランザクションを見つけることができます。そのアプリで逆方向に行けるかどうか思い出せません。お久しぶりです!

于 2013-02-26T15:45:50.580 に答える