2009-03-15 17 views
1

Ich bin kein großartiger VB-Programmierer, aber ich habe die Aufgabe, eine VB6-Desktop-Anwendung zu pflegen/zu verbessern, die Sybase ASE als Back-End verwendet. Diese App hat ungefähr 500 Benutzer.So lösen Sie Sybase-Tabellensperren (VB6)?

Kürzlich habe ich Funktionalität zu dieser Anwendung hinzugefügt, die eine zusätzliche Einfügung/Aktualisierung auf eine einzelne Zeile in der Datenbank ausführt, wobei das Schlüsselfeld die Transaktionsnummer ist und das Feld indiziert ist. Die Tabelle, die aktualisiert wird, enthält im Allgemeinen etwa 6000 Datensätze, da Datensätze nach Abschluss der Transaktionen gelöscht werden. Nach der Bereitstellung funktionierte die App gut anderthalb Tage, bevor die Benutzer eine langsame Leistung meldeten.

Schließlich verfolgten wir das Leistungsproblem zu einer Tabellensperre in der Datenbank und mussten auf die vorherige Version der App zurücksetzen. Der erste Tag der Nutzung war am Montag, was im Allgemeinen ein sehr schwerer Tag für die Systemnutzung ist, weshalb ich verwirrt bin, warum das Problem an diesem Tag nicht aufgetreten ist.

In dem Code, der vorhanden war, gibt es einen Aufruf, eine Sybase-Transaktion zu starten. Innerhalb der Block zwischen BeginTrans und CommitTrans gibt es einen Aufruf an eine DLL-Datei, die die Datenbank aktualisiert. Ich habe meinen neuen Code in einem Klassenmodul in der DLL abgelegt.

Ich bin verwirrt, warum eine einzelne Einfügung/Aktualisierung zu einer einzelnen Reihe solch ein Problem verursachen würde, besonders da das System vor der Änderung in Ordnung gewesen ist. Ist es möglich, dass ich hier ein größeres Problem aufgedeckt habe? Oder dass ich nur meinen Ansatz überdenken muss?

Vielen Dank für alle, die sich in einer ähnlichen Situation befinden und Ratschläge geben können.

+0

Ist es Deadlocking? Oder muss anderer Code nur lange auf die Freigabe warten? –

Antwort

1

Es stellt sich heraus, dass der Schuldige ein Meldungsfeld war, das im Rahmen der BeginTrans- und CommitTrans-Aufrufe angezeigt wird. Der Benutzer mit dem Nachrichtenfeld würde eine Blockierungssperre für die Datenbank beibehalten, bis sie die Nachricht bestätigt. Die Lösung bestand darin, die Nachrichtenbox außerhalb des oben genannten Bereichs zu verschieben.

+0

Es muss erkannt werden, dass eine App während einer Transaktion NIEMALS Benutzerinteraktionen zulassen darf. Wer auch immer diesen Nachrichtenblock codiert hat, hat grundlegende Transaktionsregeln gebrochen. Es ist nicht der Benutzer, sondern der Entwickler, der die Benutzerinteraktion geschrieben hat, der erzogen werden muss. – PerformanceDBA

0

Ich kann das vollständige Bild ohne den SQL-Code, den Sie verwenden, nicht verstehen.

Auch, wenn es eine einzelne Einfügung ODER ein Update ist, warum verwenden Sie eine Transaktion? Ist es möglich, dass viele Benutzer versuchen, dieselbe Zeile zu aktualisieren?

0

Es wäre hilfreich, wenn Sie sowohl den VB-Code als auch Ihre SQL (wenn möglich mit dem Abfrageplan) gepostet haben. Aber mit den Informationen, die wir haben; Ich würde update statistics table_name gegen die Tabelle ausführen, um sicherzustellen, dass der Abfrageplan aktuell ist.

Wenn Sie sicher sind, dass Ihr Code innerhalb einer Transaktion ausgeführt werden muss, haben Sie versucht, einen eigenen Transaktionsblock mit Ihrem SQL hinzuzufügen, anstatt den bereits vorhandenen zu verwenden?