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 #.

È stato utile?

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.

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