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 UPDATEs non prendere. Originariamente abbiamo pensato che potrebbe essere che le clausole WHERE sui UPDATEs 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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top