Exécution d'une procédure stockée à L'intérieur de la TRANSACTION de début/fin

si je crée une procédure stockée en SQL et que je l'appelle ( EXEC spStoredProcedure ) dans la TRANSACTION BEGIN/END, est-ce que cette autre procédure stockée entre aussi dans la transaction?

Je ne savais pas si ça marchait comme try/catches dans C#.

35
demandé sur CDspace 2008-10-07 23:50:58

7 réponses

Oui, tout que vous faites entre le début de la Transaction et de s'Engager (ou de Restauration) est la partie de la transaction.

36
répondu Blorgbeard 2008-10-07 20:11:08

sonne bien, merci beaucoup. J'ai fini par faire quelque chose comme ça (parce que je suis sur 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
11
répondu Miles 2011-11-09 01:05:34

je crois que dans MS SQL Server l'exécution de procédure stockée se produirait dans la transaction, mais soyez très prudent avec cela. Si vous avez des transactions imbriquées (c.-à-d., une transaction en dehors de la procédure stockée et une transaction différente à l'intérieur de la procédure stockée), un retour en arrière affectera toutes les transactions, et pas seulement la transaction enveloppante la plus proche.

5
répondu Chris Shaffer 2008-10-07 20:11:58

comme Chris l'a mentionné, vous devriez faire attention à ne pas annuler la transaction.

spécifiquement ceci:

IF @@TRANCOUNT > 0 ROLLBACK

n'est pas toujours ce que vous voulez. Vous pourriez faire quelque chose comme ça

IF(@@TRANCOUNT = 1) ROLLBACK TRAN
ELSE IF(@@TRANCOUNT > 1) COMMIT TRAN
RETURN @error

de cette façon, le proc appelant peut inspecter la valeur de retour de la procédure stockée et déterminer s'il veut commettre de toute façon ou continuer à gonfler l'erreur.

la raison est que "COMMIT" va décrémenter votre compteur de transactions. Une fois qu'il décrète la transaction contre zéro, alors un engagement réel se produira.

5
répondu James 2008-10-07 21:51:06

Comme Chris et James mentionné, vous devez être prudent lorsque vous traitez avec les transactions imbriquées. Il ya un ensemble un très bon articles sur le sujet des transactions écrites par Don Peterson sur SQL Server Centra l , je recommande d'avoir une lecture de ceux-ci:

ici il y a:

2
répondu kristof 2017-05-23 12:09:33

Oui, tous les appels de procédure stockés imbriqués sont inclus dans la portée de la transaction. Si vous utilisez SQL Server 2005 ou plus, vous pouvez utiliser Try...Attraper ainsi. Ici plus de détails sur ce point.

1
répondu Ben Hoffstein 2008-10-07 20:14:53

@Chris, Je ne le savais pas.

en googlant pour plus d'information, je suis tombé sur ce - vous pouvez mettre "savepoints", qui peuvent être ramenés à Sans revenir en arrière toute la transaction.

Pourrait être utile dans cette situation.

1
répondu Blorgbeard 2008-10-07 22:23:14