2012-04-04 5 views
3

histoireComment puis-je forcer un échec d'isolement de capture instantanée de 3960

J'ai un SPROC à l'aide d'isolation d'instantané pour effectuer plusieurs insertions via Merge. Ce SPROC est appelé avec une charge très élevée et souvent en parallèle, de sorte qu'il génère parfois une erreur 3960 qui indique que l'instantané a été annulé en raison de conflits de modifications. Cela est attendu en raison de la concurrence élevée.

Problème

Je l'ai mis en place un « nouvelle tentative » file d'attente pour effectuer ce travail plus tard, mais j'ai de la difficulté à reproduire l'erreur pour vérifier mes chèques sont exacts.

Question

Comment puis-je reproduire une erreur de l'instantané (3960, en particulier) pour vérifier ma logique de nouvelle tentative fonctionne?

Déjà Essayé

  • raiseError ne fonctionne pas parce que cela ne me permet pas de soulever des erreurs existantes, seules définies par l'utilisateur
  • J'ai essayé réinséré le même enregistrement, mais cela ne jette pas le même échec car il n'est pas deux transactions différentes « courses » une autre
+1

juste aller avec votre code si vous avez testé les différentes parties indépendamment de la capture d'erreur réelle. Si votre nouveau code échoue et manque l'erreur, ce ne sera pas pire alors c'est quand il échoue maintenant. –

Répondre

0

Pourquoi ne pas faire ceci:

RAISERROR(3960, {sev}, {state}) 

Remplacement de {sev} et {state} avec les valeurs réelles que vous voyez lorsque l'erreur se produit en production?

(Nope, comme Martin l'a souligné, cela ne fonctionne pas.)


Sinon que je suggère d'essayer d'exécuter votre requête de test plusieurs fois simultanément. Je l'ai fait moi-même pour simuler d'autres erreurs de concurrence. Cela devrait être faisable tant que la requête de test n'est pas trop rapide (quelques secondes au moins).

+1

'RAISERROR' ne peut pas être utilisé pour élever les numéros d'erreur du système. –

+1

Huh, c'est vrai. Je suppose que je n'ai jamais essayé auparavant ... Quoi qu'il en soit, l'autre méthode devrait fonctionner (si la requête de test n'est pas trop rapide). Que j'ai * fait * auparavant. – RBarryYoung

+0

Merci pour les réponses! J'ai passé du temps à essayer de recréer la condition de la course sans aucune chance. Finalement, l'équipe a décidé que le code était pris en charge avec une journalisation suffisante, de sorte qu'il a été approuvé pour être déployé en direct. – Jordan

1

Ouvrez deux connexions, démarrer une opération de cliché sur les deux, sur la connexion 1 mise à jour d'un enregistrement, sur la connexion 2 mise à jour le même enregistrement (en arrière-plan, car il bloque), puis sur la connexion 1 commit

ou traiter une erreur d'utilisateur comme un 3960 ...

Questions connexes