Esecuzione di una procedura memorizzata in BEGIN / END TRANSACTION
-
05-07-2019 - |
Domanda
Se creo una Stored procedure in SQL e la chiamo ( EXEC spStoredProcedure
) all'interno di BEGIN / END TRANSACTION, anche questa altra procedura memorizzata rientra nella transazione?
Non sapevo se funzionasse come try / catch in C #.
Soluzione
Sì, tutto che fai tra Begin Transaction e Commit (o Rollback) fa parte della transazione.
Altri suggerimenti
Sembra fantastico, grazie mille. Ho finito per fare qualcosa del genere (perché sono il 05)
BEGIN TRY
BEGIN TRANSACTION
DO SOMETHING
COMMIT
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK
-- Raise an error with the details of the exception
DECLARE @ErrMsg nvarchar(4000), @ErrSeverity int
SELECT @ErrMsg = ERROR_MESSAGE(),
@ErrSeverity = ERROR_SEVERITY()
RAISERROR(@ErrMsg, @ErrSeverity, 1)
END CATCH
Credo che in MS SQL Server l'esecuzione della procedura memorizzata avvenga all'interno della transazione, ma presta molta attenzione. Se sono presenti transazioni nidificate (ovvero transazioni al di fuori della procedura memorizzata e una transazione diversa all'interno della procedura memorizzata), un rollback influirà su TUTTE le transazioni, non solo sulla transazione allegata più vicina.
Come ha detto Chris, dovresti stare attento a ripristinare la transazione.
In particolare questo:
IF @@TRANCOUNT > 0 ROLLBACK
non è sempre quello che vuoi. Potresti fare qualcosa del genere
IF(@@TRANCOUNT = 1) ROLLBACK TRAN
ELSE IF(@@TRANCOUNT > 1) COMMIT TRAN
RETURN @error
In questo modo, il proc chiamante può ispezionare il valore restituito dalla procedura memorizzata e determinare se desidera comunque eseguire il commit o continuare a eliminare l'errore.
Il motivo è che 'COMMIT' diminuirà semplicemente il contatore delle transazioni. Una volta che il contatore delle transazioni viene ridotto a zero, si verificherà un commit effettivo.
Come Chris e James menzionato, devi fare attenzione quando gestisci transazioni nidificate. C'è un set di articoli molto buoni sull'argomento delle transazioni scritte da Don Peterson su SQL Server Centra l, consiglierei di leggerne:
Qui ci sono:
Sì, tutte le chiamate di procedure memorizzate nidificate sono incluse nell'ambito della transazione. Se si utilizza SQL Server 2005 o versione successiva, è possibile utilizzare anche Try ... Catch. Qui sono disponibili ulteriori dettagli.
@Chris, non lo sapevo.
Quando ho cercato su Google maggiori informazioni, mi sono imbattuto in this - puoi impostare "punti di salvataggio", che possono essere ripristinati senza ripristinare l'intera transazione.
Potrebbe essere utile in questa situazione.