Transazioni con ambito corretto in Stored Procs
-
01-07-2019 - |
Domanda
Supponiamo di avere una procedura memorizzata che gestisce la propria transazione
CREATE PROCEDURE theProc
AS
BEGIN
BEGIN TRANSACTION
-- do some stuff
IF @ThereIsAProblem
ROLLBACK TRANSACTION
ELSE
COMMIT TRANSACTION
END
Se chiamo questo proc da una transazione esistente, il proc può ROLLBACK della transazione esterna.
BEGIN TRANSACTION
EXEC theProc
COMMIT TRANSACTION
Come posso definire correttamente l'ambito della transazione all'interno della procedura memorizzata, in modo che la procedura memorizzata non esegua il rollback delle transazioni esterne?
Soluzione
La sintassi per eseguire questa operazione probabilmente varia in base al database.Ma in Transact-SQL quello che fai è controllare @@TRANCOUNT per vedere se sei in una transazione.Se lo sei, allora vuoi creare un punto di salvataggio e alla fine puoi semplicemente passare attraverso la fine della funzione (credendo che un commit o un rollback avverrà in seguito) oppure eseguire il rollback al tuo punto di salvataggio.
Consulta la documentazione di Microsoft su punti di salvataggio per più.
Il supporto per i punti di salvataggio è abbastanza diffuso, ma penso che il meccanismo (supponendo che ce ne sia uno) per scoprire che sei attualmente in una transazione varierà parecchio.
Altri suggerimenti
usa @@trancount per vedere se sei già in una transazione quando entri