Frage

Ich bin kein großer VB Programmierer, aber ich bin mit der Aufrechterhaltung / Verbesserung eine VB6-Desktop-Anwendung beauftragt, die Sybase ASE als Back-End verwendet. Diese App hat etwa 500 Benutzer.

Vor kurzem habe ich eine erweiterte Funktionalität dieser Anwendung, die in der Datenbank, Schlüsselfeld sein Transaktionsnummer und das Feld indiziert ist eine zusätzliche insert / update auf eine einzelne Zeile durchführt. Die Tabelle aktualisiert hat in der Regel etwa 6000 Datensätze in ihm, als Datensätze entfernt werden, wenn Transaktionen abgeschlossen sind. Nach der Bereitstellung arbeitete die App für einen Tag in Ordnung und eine Hälfte vor Benutzern wurden langsam Performance Reporting.

Schließlich verfolgte man das Leistungsproblem zu einer Tabellensperre in der Datenbank und musste wieder auf die vorherige Version der App rollen. Der erste Tag der Verwendung wurde am Montag, die für das System im Allgemeinen ein sehr schwerer Tag ist, also bin ich verwirrt, warum das Thema an diesem Tag nicht erschienen.

In dem Code, der an Ort und Stelle war, gibt es einen Aufruf eine Sybase-Transaktion zu starten. Innerhalb des Blocks zwischen den Begintran und CommitTrans gibt es einen Aufruf an eine DLL-Datei, die die Datenbank aktualisiert. Ich legte meinen neuen Code in einem Klassenmodul in der DLL.

Ich bin verwirrt, warum ein einzelner insert / update auf eine einzige Zeile ein solches Problem verursachen würde, vor allem, da das System in Ordnung vor dem Wechsel gearbeitet hatte. Ist es möglich, ich habe ein größeres Problem hier ausgesetzt? Oder, dass ich gerade brauche, um meinen Ansatz überdenken?

Vielen Dank im Voraus für alle, die in einer ähnlichen Situation gewesen und Beratung bieten kann.

War es hilfreich?

Lösung

Es stellt sich heraus, dass der Täter ein Meldungsfeld war, die im Rahmen des Begintran erscheint und CommitTrans nennt. Der Benutzer mit dem Meldungsfeld würde eine Sperr Sperre für die Datenbank pflegen, bis sie die Nachricht bestätigt. Die Lösung war das Meldungsfeld außerhalb des oben genannten Umfangs zu bewegen.

Andere Tipps

Ich bin nicht in der Lage das komplette Bild ohne den SQL-Code zu verstehen, dass Sie verwenden.

Auch wenn es sich um eine einzelne Einfügung oder Aktualisierung ist, warum verwenden Sie eine Transaktion? Ist es möglich, dass viele Benutzer versuchen, die gleiche Zeile zu aktualisieren?

Es wäre hilfreich, wenn Sie sowohl die VB geschrieben Code und Ihre SQL (mit dem Abfrage-Plan, wenn möglich). Jedoch mit der Information, die wir haben; Ich würde update statistics table_name gegen den Tisch laufen, um sicherzustellen, dass der Abfrage-Plan auf dem neuesten Stand ist.

Wenn Sie sicher sind, dass Ihr Code innerhalb einer Transaktion ausgeführt hat haben Sie versucht, Ihren eigenen Transaktionsblock mit Ihrem SQL Hinzufügen anstatt die man schon da?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top