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
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;
}
}
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
À 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
Begin TRAN
BEGIN TRY
-- your Action
Commit TRAN
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
BEGIN
ROLLBACK TRAN
END
END CATCH