Frage

Ich habe eine T-SQL gespeicherte Prozedur bekommt auf einem Sybase ASE-Datenbank-Server ausgeführt wird, die manchmal alle ihre Operationen zu begehen versagt, auch wenn es ohne Ausnahme abgeschlossen ist. Hier ist ein einfaches Beispiel von dem, was sie tut.

BEGIN TRANSACTION

UPDATE TABLE1
SET FIELD1 = @NEW_VALUE1
WHERE KEY1 = @KEY_VALUE1

IF @@error <> 0 OR @@rowcount <> 1 BEGIN
    ROLLBACK
    RETURN 1
END

UPDATE TABLE2
SET FIELD2 = @NEW_VALUE2
WHERE KEY2 = @KEY_VALUE2

IF @@error <> 0 OR @@rowcount <> 1 BEGIN
    ROLLBACK
    RETURN 2
END

INSERT TABLE2 (FIELD2, FIELD3)
VALUES (@NEW_VALUE3a, @NEW_VALUE3b)

IF @@error <> 0 OR @@rowcount <> 1 BEGIN
    ROLLBACK
    RETURN 3
END

COMMIT TRANSACTION
RETURN 0

Das Verfahren wird mindestens mehrere hundert Mal pro Tag genannt. In einem kleinen Prozentsatz der Fälle (wahrscheinlich <3%), nur die INSERT Aussage verpflichtet. Die proc abgeschlossen ist und den Wert 0 zurück, aber die beiden UPDATEs nicht nehmen. Ursprünglich dachten wir, es könnte sein, dass die WHERE Klauseln über den UPDATEs nichts waren passend, so dass wir die IF @@rowcount Logik hinzugefügt. Aber auch bei diesen Kontrollen dort wird der INSERT noch geschieht, und das Verfahren ist noch abgeschlossen und 0 zurück.

Ich bin auf der Suche nach Ideen, was könnte diese Art von Problem verursachen. Gibt es etwas über die Art und Weise SQL-Transaktionen arbeiten, oder die Art und Weise Sybase speziell funktioniert, welche die COMMIT verursachen könnten nicht alles zu begehen? Gibt es etwas über meine IF Blöcke, die das UPDATE passen nicht alles erlauben konnte, aber das Verfahren fortzusetzen? Jede andere Ideen?

War es hilfreich?

Lösung

ist möglich, dass sie die Aktualisierung sind, sondern etwas ist, um die Werte zu ändern zurück? versuchen, ein Update-Trigger für diese Tabellen Hinzufügen und innerhalb dieser Trigger-Einsatz in eine Log-Tabelle. für Zeilen, die nicht sieht im Protokoll zu haben scheinen aktualisiert worden ist, gibt es eine Reihe oder nicht?

Andere Tipps

Nicht zu wissen, wie Sie die Werte für die Variablen festgelegt, fällt mir ein, dass, wenn der Wert von @ NEW_VALUE1 ist der gleiche wie der vorherige Wert in FIELD1 würde das Update erfolgreich zu sein und noch nichts geändert zu haben scheinen, dass Sie denken, die Transaktion noch nicht geschehen ist.

Sie können auch einen Auslöser, die das Update betrifft.

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