2012-07-10 18 views
6
USE AdventureWorks; 
GO 
BEGIN TRANSACTION; 
GO 
DELETE FROM HumanResources.JobCandidate WHERE JobCandidateID = 10; 
DELETE FROM HumanResources.JobCandidate WHERE JobCandidateID = 11; 
DELETE FROM HumanResources.JobCandidate WHERE JobCandidateID = 12; 
GO 
COMMIT TRANSACTION; 
GO 

Cosa succede se la prima istruzione di eliminazione non riesce? La seconda e la terza cancellazione verranno eseguite? L'esempio non ha alcuna gestione degli errori, lascerà una transazione aperta nel caso di un'eccezione o eseguirà il rollback della transazione automaticamente da parte di SQL Server? Transazione aperta = risorse bloccate, giusto?È richiesta la ROLLBACK TRANSACTION?

Sto decidendo se è necessario applicare TRY ... CATCH alle stored procedure che utilizzano le transazioni.

Sono a conoscenza di set xact_abort on, ma voglio sapere cosa succede senza di esso.

Ecco quello che ho trovato in documenti - gestione delle transazioni (Motore di database):

Se un errore impedisce il completamento di una transazione, SQL Server esegue automaticamente il rollback della transazione e libera tutte le risorse possedute dalla transazione

Tuttavia, in altri post ho letto che il rollback automatico non viene attivato.

+0

Sì, usa prova ... cattura. – Ben

risposta

11

Nel tuo esempio, senza l'uso di SET XACT_ABORT ON, l'operazione continuerà e si impegnano, anche se la prima istruzione fallisce. Nel testo che hai citato, le parole chiave sono if an error **prevents** the successful completion of a transaction e un errore di dichiarazione DELETE non impedisce il completamento della transazione.

Un esempio di errore che causerebbe un rollback automatico è se la connessione al database è stata interrotta nel mezzo di una transazione. Proseguendo lungo la MSDN article si fa riferimento dice:

Se un errore di dichiarazione di run-time (ad esempio una violazione di vincolo) si verifica in un batch, il comportamento predefinito nel motore di database è quello di rotolare indietro solo l'affermazione che generato l'errore. È possibile modificare questo comportamento utilizzando l'istruzione SET XACT_ABORT. Dopo l'esecuzione di SET XACT_ABORT ON , qualsiasi errore di dichiarazione di runtime provoca un rollback automatico della transazione corrente. Errori di compilazione, come errori di sintassi, sono non influenzati da SET XACT_ABORT.

È sempre consigliabile utilizzare la gestione degli errori per rilevare errori e il rollback, se necessario.

+0

Quindi eseguirà il rollback della prima istruzione cancellata fallita, quindi inizierà l'esecuzione della seconda e poi nello stesso modo - la terza? E alla fine andrà giù per rilasciare una dichiarazione? Ciò significa che l'errore in una singola istruzione non fermerà l'esecuzione in batch, giusto? –

+0

Esattamente. Inoltre, ho aggiornato la mia risposta (si spera) un po 'più chiara :) –

5

preferisco per controllare il processo manualmente:

BEGIN TRY 
BEGIN TRAN 

    -- do work 

COMMIT 
END TRY 
BEGIN CATCH 
    ROLLBACK 
    RAISERROR (...) 
END CATCH 
GO 
Problemi correlati