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?

È stato utile?

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

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