Une requête s'exécuterait-elle dans une instruction try qui aurait échoué si elle était antérieure à l'erreur?

Disons que j'ai l'exemple suivant (Pseudo Code Exemple)

try{ INSERT SQL to DB 1 INSERT SQL to DB 2 --FAILURE OCCURS HERE FOR SOME REASON AND IT GOES TO CATCH STATEMENT INSERT SQL to DB 3 }catch(err){ ERROR MESSAGE } 

Les deux premières requêtes seraient-elles exécutées sur la database parce qu'elles étaient antérieures à l'erreur?

ou

Le programme sait-il une erreur et ne pas exécuter le bloc de code dans l'instruction try et sauter le détroit dans le bloc catch?

Voici comment vous pouvez gérer la situation que vous décrivez à l'intérieur d'une procédure stockée:

 BEGIN TRANSACTION; BEGIN TRY INSERT SQL to DB 1 INSERT SQL to DB 2 --FAILURE OCCURS HERE FOR SOME REASON AND IT GOES TO CATCH STATEMENT INSERT SQL to DB 3 END TRY BEGIN CATCH IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION; -- Return 0 value to indicate failure of execution RETURN 0 END CATCH; -- If transaction is still active then commit it IF (@@TRANCOUNT > 0) COMMIT TRANSACTION; -- Return 1 value to indicate successful execution of INSERT statements RETURN 1 

En cas d'échec d' une instruction INSERT dans le bloc TRY , toutes ces instructions sont annulées. Sinon, toutes les requêtes INSERT sont validées dans la database.

Vous pouvez implémenter une logique similaire en C #, mais il est généralement préférable d'envelopper l'implémentation entière dans une procédure stockée.

Il existe des moyens dans les langages de programmation (adaptateurs / interfaces DB) pour gérer les transactions au niveau DB. Si ces trois requêtes ne sont pas enroulées autour d'un code qui ouvre essentiellement une transaction et la termine après la troisième instruction en utilisant une validation, alors les deux requêtes ci-dessus auraient déjà été exécutées sur la database et validées individuellement. A en juger par votre code, il n'y a pas de lignes de transaction open / commit / rollback autour des 3 instructions, ce qui signifie que les deux instructions ci-dessus ont déjà été validées dans la database. Toutefois, si vous encapsulez ces 3 instructions autour d'un bloc transaction / commit, et si une instruction échoue, les requêtes déjà exécutées seront annulées car le bloc catch du code informera le moteur DB que la transaction est ouverte et non validée mais une exception est survenue, donc annuler les instructions précédemment exécutées.