2009-03-15 13 views
1

私は素晴らしいVBプログラマではありませんが、Sybase ASEをバックエンドとして使用するVB6デスクトップアプリケーションのメンテナンス/拡張を担当しています。このアプリは約500人のユーザーがいます。Sybaseテーブルロック(VB6)を解決するには?

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

最終的に、パフォーマンスの問題をデータベース内のテーブルロックにトレースし、アプリケーションの以前のバージョンにロールバックする必要がありました。最初の日は月曜日でしたが、これは一般的にシステムの使用に非常に重い一日です。その日に問題が表示されない理由は混乱しています。

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

特に、変更前にシステムが正常に動作していたため、1つの行への1つの挿入/更新でこのような問題が発生するのは混乱します。私はここで大きな問題を抱えている可能性はありますか?それとも私のアプローチを再考する必要があるのか​​?

似たような状況にあってアドバイスをいただける方に感謝します。

+0

デッドロックですか?あるいは、ロックが解放されるまでに長時間待たなければならないコードは他にありますか? –

答えて

1

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

+0

アプリケーションは、トランザクション中にいかなる種類のユーザーとのやりとりを許可してはいけないということを特定する必要があります。誰でもそのメッセージブロックをコード化し、基本的なトランザクションルールを破った。これは、ユーザーではなく、開発者で、ユーザーのやりとりを書いたユーザーで、教育を受ける必要があります。 – PerformanceDBA

0

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

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

0

VBコードとSQ​​L(可能であればクエリプランを含む)の両方を投稿した場合に役立ちます。しかし、私たちが持っている情報では、クエリの計画が最新であることを確認するために、テーブルに対してupdate statistics table_nameを実行します。

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

関連する問題