2012-04-04 6 views
3

GeschichteWie kann ich einen Snapshot Isolation Ausfall von 3960

Ich zwinge eine SPROC Snapshot Isolation mit mehreren Einsätzen über MERGE auszuführen. Dieser SPROC wird mit sehr hoher Last und oft parallel aufgerufen, so dass gelegentlich ein Fehler 3960 ausgelöst wird, der anzeigt, dass der Snapshot aufgrund von Änderungskonflikten zurückgesetzt wurde. Dies wird wegen der hohen Parallelität erwartet.

Problem

ich eine „Wiederholung“ Warteschlange implementiert haben später diese Arbeit wieder auszuführen, aber ich Schwierigkeiten habe den Fehler reproduzieren meine Schecks genau sind, um zu überprüfen.

Frage

Wie kann ich einen Schnappschuss Ausfall reproduzieren (3960, speziell) meine Wiederholungslogik arbeitet, um zu überprüfen?

bereits versucht

  • Raiseerror nicht funktioniert, weil es nicht erlaubt, mich bestehende Fehler zu erhöhen, nur benutzerdefinierte diejenigen
  • ich wieder eingesetzt denselben Datensatz versucht haben, aber dies nicht der gleiche Fehler werfen, da es nicht zwei verschiedene Transaktionen „Rennen“ ist eine andere
+1

gehen Sie einfach mit Ihrem Code, wenn Sie die verschiedenen Teile unabhängig von der tatsächlichen Fehler Catch getestet haben. Wenn Ihr neuer Code fehlschlägt und den Fehler verfehlt, wird es nicht schlimmer, als wenn es jetzt versagt. –

Antwort

0

Warum dies nicht nur tun:

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

Ersetzen von {sev} und {state} durch die tatsächlichen Werte, die beim Auftreten des Fehlers in der Produktion angezeigt werden?

(Nö, wie Martin darauf hingewiesen, dass die Arbeit nicht.)


Wenn nicht, dann würde ich vorschlagen, um Ihren Test Abfrage mehrmals versucht, gleichzeitig zu laufen. Ich habe das selbst gemacht, um andere Nebenläufigkeitsfehler zu simulieren. Es sollte möglich sein, solange die Testabfrage nicht zu schnell ist (mindestens ein paar Sekunden).

+1

'RAISERROR' kann nicht zum Erhöhen von Systemfehlerzahlen verwendet werden. –

+1

Huh, genau du bist. Schätze, ich habe es vorher noch nie versucht ... Wie auch immer, die andere Methode sollte funktionieren (wenn die Testabfrage nicht zu schnell ist). Das habe ich vorher getan. – RBarryYoung

+0

Danke für die Antworten! Ich habe viel Zeit damit verbracht, den Rennzustand ohne Glück nachzubilden. Schließlich entschied das Team, dass der Code mit ausreichend Protokollierung unterstützt wurde, sodass die Bereitstellung für den Live-Einsatz genehmigt wurde. – Jordan

1

öffnen Sie zwei Verbindungen, eine Snapshot-Transaktion auf beiden starten, auf der Verbindung 1-Update eine Aufzeichnung auf der Verbindung 2-Update denselben Datensatz (im Hintergrund, weil es blockiert), dann auf Anschluss 1

begehen oder behandeln ein Benutzerfehler als 3960 ...

Verwandte Themen