web-dev-qa-db-fra.com

Comment SQL Server traite-t-il les instructions dans les procédures stockées en ce qui concerne les transactions?

Supposons que j'ai une procédure stockée composée de plusieurs instructions SELECT, INSERT, UPDATE et DELETE distinctes. Il n'y a pas de logique explicite BEGIN TRANS/COMMIT TRANS/ROLLBACK TRANS.

Comment SQL Server traitera-t-il cette procédure stockée au niveau des transactions? Y aura-t-il une connexion implicite pour chaque instruction? Ou y aura-t-il une transaction pour la procédure stockée?

De plus, comment aurais-je pu le découvrir par moi-même en utilisant T-SQL et/ou SQL Server Management Studio?

Merci!

44
Sleepless

Il n'y aura qu'une seule connexion, c'est ce qui est utilisé pour exécuter la procédure, quel que soit le nombre de commandes SQL dans la procédure stockée.

dans la mesure où vous n'avez aucune opération BEGIN TRANSACTION explicite dans la procédure stockée, chaque instruction s'exécute d'elle-même sans possibilité d'annuler les modifications en cas d'erreur.

Toutefois, si vous avant d'appeler la procédure stockée vous émettez une opération BEGIN TRANSACTION, toutes les instructions sont regroupées dans une transaction et peuvent être COMMITted ou ROLLBACKed après l'exécution de la procédure stockée.

À partir de la procédure stockée, vous pouvez déterminer si vous exécutez une transaction en vérifiant la valeur de la variable système @@ TRANCOUNT (Transact-SQL) . Un zéro signifie qu'il n'y a pas de transaction, tout le reste indique le nombre de transactions imbriquées dans lesquelles vous vous trouvez. Selon la version de votre serveur SQL, vous pouvez également utiliser XACT_STATE (Transact-SQL) .

Si vous procédez comme suit:

BEGIN TRANSACTION

EXEC my_stored_procedure_with_5_statements_inside @Parma1

COMMIT

tout dans la procédure est couvert par la transaction, les 6 instructions (EXEC est une instruction couverte par la transaction, 1 + 5 = 6). Si tu fais ça:

BEGIN TRANSACTION

EXEC my_stored_procedure_with_5_statements_inside @Parma1
EXEC my_stored_procedure_with_5_statements_inside @Parma1

COMMIT

tout dans les deux appels de procédure est couvert par la transaction, les 12 instructions (les 2 EXEC sont tous les deux couverts par la transaction, 1 + 5 + 1 + 5 = 12).

35
KM.

Vous pouvez le découvrir par vous-même en créant une petite procédure stockée qui fait quelque chose de simple, par exemple insérer un enregistrement dans une table de test. Commence alors Tran; exécutez sp_test; retour en arriere; Le nouveau record est-il là? Si tel est le cas, le SP ignore la transaction externe. Sinon, le SP n'est qu'une autre instruction exécutée à l'intérieur de la transaction (ce qui, j'en suis sûr, est l'affaire).

1
MJB