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