web-dev-qa-db-fra.com

SQL Server: transaction de procédure stockée

Bonjour, j'ai des procédures stockées pour créer des produits et d'autres éléments sur mon site. Maintenant, je dois en exécuter certaines dans une transaction. Est-ce possible ou dois-je créer une procédure stockée uniquement pour la transaction?

Puis-je dire quelque chose comme

BEGIN TRAN
"1. stored procedure"
"2. stored procedure"
COMMIT
19
saadan

Pour ajouter aux autres réponses ci-dessus, vous voudrez peut-être ajouter un traitement des erreurs:

BEGIN TRAN

BEGIN TRY

   EXEC P1

   EXEC P2

   COMMIT TRAN

END TRY
BEGIN CATCH

  ROLLBACK TRAN

END CATCH

Mise à jour avec du code C # (je trouve personnellement qu'il est beaucoup plus facile de garder le code trans des sprocs et de la couche de données - facilite la composition de procédures stockées ultérieurement):

using (var conn = new SqlConnection(...))

    trans = conn.BeginTransaction();

    try
   {
       ...call P1 using transaction
       ...call P2 using transaction

       trans.Commit();
   }
   catch
   {
       trans.RollBack();
       throw;
   }
}
40
Paddy

Oui, une procédure stockée peut être exécutée dans une transaction. Veuillez trouver ci-dessous un exemple de requête.

create table temp1
(
    id int,
    name varchar(20)
)

create table temp2
(
    id int,
    name varchar(20)
)
go

create proc p1 as
insert temp1 values (1, 'test1')


create proc p2 as 
insert temp2 values (1, 'test2')
go  

begin tran tx
exec p1
exec p2
commit
3
aravind

À partir de SQL Server (vous n'êtes pas sûr des autres SGBDR), vous pouvez appeler plusieurs procédures stockées dans une transaction.

BEGIN TRAN
EXEC StoredProc1
EXEC StoredProc2
COMMIT TRAN

Vous voudrez peut-être ajouter un code de retour au processus stocké pour vérifier si vous devez exécuter le processus stocké 2 si le processus stocké 1 a échoué.

EDIT: Pour vérifier un code de retour, vous pouvez procéder comme suit. Cela lancera le premier proc stocké. S'il renvoie 0, il exécute le 2e. Si le 2e retourne 0, alors il valide la transaction. Si l'un des deux renvoie non-0, la transaction sera annulée

DECLARE @ReturnValue INT
BEGIN TRAN
  EXEC @ReturnValue = StoredProc1
  IF @ReturnValue = 0
  BEGIN
    EXEC @ReturnValue = StoredProc2
    IF @ReturnValue = 0
    BEGIN
      COMMIT
    END
    ELSE
    BEGIN
      ROLLBACK
    END
  END
  ELSE
  BEGIN
    ROLLBACK
  END
2
Greg
Begin TRAN
BEGIN TRY
  -- your Action
  Commit TRAN
END TRY
BEGIN CATCH
  IF @@TRANCOUNT > 0
  BEGIN
    ROLLBACK TRAN
  END 
END CATCH
0
fstephenster