質問

私は優れた VB プログラマではありませんが、Sybase ASE をバックエンドとして使用する VB6 デスクトップ アプリケーションを保守/強化する任務を負っています。このアプリには約 500 人のユーザーがいます。

最近、このアプリケーションに、データベース内の単一行に対して追加の挿入/更新を実行する機能を追加しました。キー フィールドはトランザクション番号であり、フィールドにはインデックスが付けられます。レコードはトランザクションが完了すると削除されるため、更新されるテーブルには通常約 6000 レコードが含まれます。導入後、ユーザーからパフォーマンスの低下が報告されるまで、アプリは 1 日半正常に動作しました。

最終的に、パフォーマンスの問題の原因がデータベース内のテーブル ロックにあることが判明し、アプリを以前のバージョンにロールバックする必要がありました。最初の使用日は月曜日で、一般的にシステムの使用量が非常に多い日であるため、なぜその日に問題が発生しなかったのか不思議です。

配置されたコードには、Sybase トランザクションを開始する呼び出しがあります。BeginTrans と CommitTrans の間のブロック内に、データベースを更新する DLL ファイルへの呼び出しがあります。新しいコードを DLL のクラス モジュールに配置しました。

特に変更前はシステムが正常に動作していたため、単一の行に対する単一の挿入/更新がなぜこのような問題を引き起こすのか、私は混乱しています。ここでさらに大きな問題が明らかになった可能性はありますか?それとも自分のアプローチを再考する必要があるだけでしょうか?

同じような状況に陥った方、アドバイスをいただける方、よろしくお願いします。

役に立ちましたか?

解決

原因は、BeginTransおよびCommitTrans呼び出しのスコープ内に表示されるメッセージボックスでした。メッセージボックスを持つユーザーは、メッセージを確認するまでデータベースのブロックロックを維持します。解決策は、メッセージボックスを前述の範囲外に移動することでした。

他のヒント

使用しているSQLコードがないと、全体像を理解できません。

また、単一の挿入または更新である場合、なぜトランザクションを使用しているのですか?多くのユーザーが同じ行を更新しようとする可能性はありますか?

VB コードと SQL (可能であればクエリ プランも) の両方を投稿していただけると助かります。しかし、私たちが持っている情報では、私なら走るだろう update statistics table_name テーブルと照合して、クエリ プランが最新であることを確認します。

コードをトランザクション内で実行する必要があると確信している場合は、既存のトランザクション ブロックを使用するのではなく、SQL を含む独自のトランザクション ブロックを追加してみましたか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top