Datenbank-Transaktion nur teilweise zu begehen
-
22-09-2019 - |
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 UPDATE
s nicht nehmen. Ursprünglich dachten wir, es könnte sein, dass die WHERE
Klauseln über den UPDATE
s 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?
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.