Alex Kuznetsov a un grand chapitre dans son livre Defensive Database Programming (Chapter 8) qui couvre T-SQL TRY ... CATCH, les transactions T-SQL & SET XACT_ABORT et l'utilisation de la gestion des erreurs côté client. Cela vous aidera beaucoup à décider laquelle des options est la plus logique pour ce que vous devez accomplir.
Il est disponible gratuitement sur ce site . Je ne suis en aucun cas affilié à la société, mais je possède la version papier de ce livre.
Il y a beaucoup de petits détails sur ce sujet qui sont très bien expliqués par Alex.
Selon la demande de Nick ... (mais tout cela n'est pas dans le chapitre)
En termes de mise à l'échelle, vous devez être brutalement honnête sur les activités qui doivent être dans le code db et celles qui doivent être dans l'application. Avez-vous déjà remarqué à quel point le code à exécution rapide a tendance à revenir à la conception pour une seule préoccupation par méthode?
Le moyen le plus simple de communiquer serait des codes d'erreur personnalisés (> 50 000). C'est aussi assez rapide. Cela signifie que vous devez synchroniser le code DB et le code d'application. Avec un code d'erreur personnalisé, vous pouvez également renvoyer des informations utiles dans la chaîne de message d'erreur. Parce que vous avez un code d'erreur strictement pour cette situation, vous pouvez écrire un analyseur dans le code d'application adapté au format de données de l'erreur.
De plus, quelles conditions d'erreur nécessitent une logique de nouvelle tentative dans la base de données? Si vous souhaitez réessayer après X secondes, vous feriez mieux de gérer cela dans le code de l'application afin que la transaction ne bloque pas autant. Si vous ne soumettez à nouveau qu'une opération DML immédiatement, la répéter dans le SP pourrait être plus efficace. Gardez à l'esprit, cependant, que vous devrez éventuellement dupliquer du code ou ajouter une couche de SP pour effectuer une nouvelle tentative.
Vraiment, c'est actuellement le plus gros problème avec la logique TRY ... CATCH dans SQL Server pour le moment. Cela peut être fait, mais c'est un peu un oaf. Recherchez certaines améliorations à venir dans SQL Server 2012, en particulier la relance des exceptions système (en conservant le numéro d'erreur d'origine). En outre, il existe FORMATMESSAGE , qui ajoute une certaine flexibilité dans la création de messages d'erreur, en particulier à des fins de journalisation.