最善の選択肢は、それらのアプリケーションをリファクタリングすることです。
FB/IB の自然なモードは、2 つの並列トランザクションを持つことです。
長時間の編集トランザクションは、ガベージ コレクションをブロックし、データベース (およびインデックス) に多くの偽のデータを強制的に含めることで、データベースに影響を与えています。
IBX + IBQuery + TUpdateSQL のようなある種のカスタム更新クエリを介してこれを行うことができるかどうかはわかりませんが、bDE 時代にありました。サードパーティの FB 接続ライブラリは通常、双方向トランザクション モードをある程度サポートしています。
ただし、このアプローチでは、アプリケーションの設計方法に非常に特殊なパターンが課せられ、Firebird がデータの一貫性を保証できなくなります。これはアプリケーションの負担になります。コメントはそれについての素晴らしいリンクをもたらしました: Re: [firebird-support] Long read-only Transactions
最新の Firebird では、データベース管理者/所有者の役割を持っている場合、トランザクションを強制的に削除できます。モニタリング テーブルについてお読みください。2.5.1 にはバグがあったので、おそらく 2.5.2 のリリースを待つことに注意してください。
ただし、これらのトランザクションを強制的にロールバックすると、アプリケーションはどのように動作しますか? ユーザーはまだ編集を続けていて、変更のほとんどが失われていることに突然気付きます。
PS。http://www.sql.ru/forum/actualthread.aspx?tid=910920このコードはmon$transactions
、トランザクションを接続にマップするために使用し、問題のあるアプリケーションを強制的に切断します。直接delete from mon$transactions where...
が利用できない場合、それが残されたオプションになります。
PPS。FB 2.1 以来、長時間のトランザクションは数分ごとに (たとえ r/o であっても) コミット (およびクローズ) する必要があります。その理由は、トランザクションのクローズによってのみリセットされるデータベースの制御不能な成長につながる可能性のある BLOB 計算を使用した場合です。これにより、すべての db-aware コントロールの再読み取りがトリガーされる可能性がありますが、MIDAS ClientDataset のような中間キャッシュなしでトランザクションを操作すると、データベースのインフレよりも間違いなく優れており、まれに非常に高速であると報告されています。