transazioni di database solo parzialmente commettere
-
22-09-2019 - |
Domanda
Ho una procedura di T-SQL memorizzati in esecuzione su un server di database Sybase ASE che a volte riesce a impegnare tutte le sue operazioni, anche se è completa senza eccezioni. Ecco un esempio di massima di ciò che fa.
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
La procedura viene chiamata almeno centinaia di volte al giorno. In una piccola percentuale di questi casi (probabilmente <3%), solo la dichiarazione INSERT
impegna. Il proc completa e restituisce 0, ma i due UPDATE
s non prendere. Originariamente abbiamo pensato che potrebbe essere che le clausole WHERE
sui UPDATE
s non erano corrispondenti niente, quindi abbiamo aggiunto la logica IF @@rowcount
. Ma anche con tali controlli in là, il INSERT
è ancora accadendo e la procedura è ancora completando e restituendo 0.
Sto cercando idee su che cosa potrebbe causare questo tipo di problema. C'è qualcosa sul modo in cui le transazioni SQL funzionano, o il modo in cui Sybase lavora specificamente, che potrebbe essere la causa del COMMIT
non commettere tutto? C'è qualcosa sui miei blocchi IF
che potrebbe consentire l'UPDATE per non corrisponde nulla, ma la procedura di continuare? Tutte le altre idee?
Soluzione
è è possibile che essi sono l'aggiornamento, ma qualcosa sta cambiando i valori di nuovo? provare ad aggiungere un trigger di aggiornamento su quei tavoli e all'interno di tale inserto grilletto in una tabella di log. per le righe che sembrano non sono stati aggiornati sguardo nel registro, c'è una riga o no?
Altri suggerimenti
Non sapendo come impostare i valori per le variabili, mi viene in mente che se il valore di @ NEW_VALUE1 è lo stesso come il valore precedente nel FIELD1, l'aggiornamento sarebbe successo e tuttavia sembrano non hanno cambiato nulla fa pensare la transazione non fosse accaduto.
È inoltre potrebbe avere un trigger che sta interessando l'aggiornamento.