Verhalten einer loop innerhalb einer einzigen TRANSAKTION

Ich habe folgende Struktur:

PROCEDURE A BEGIN TRANSACTION WHILE <loops 20 times> BEGIN --10 minute script --INSERT a single record into table X END COMMIT TRANSACTION PROCEDURE B - This is run via the agent every 10 minutes it scans table X for any new entries and if it finds any it sends an e-mail 

Wenn alles ordnungsgemäß läuft, werden neue Tabellen in die Tabelle X aufgenommen – werden diese datasätze nur dann hinzugefügt, wenn alle 20 loops erfolgreich waren? Wenn die loop an die 5. Iteration kommt und dann Fehler die ersten 4 datasätze begangen werden?

Nun, halten eine Transaktion für 10 Minuten offen ist böse. Halten einer Transaktion offen 20 mal für 10 Minuten ist … gut, 20 mal mehr böse. Lange gelebte transactions sind sehr sehr sehr schädlich und sie verursachen ernsthafte Probleme beim Sperren und Blockieren, Log-Nutzung und Wachstum, Erholung Probleme. Entcasting Sie niemals etwas, das länger als Sekunden ist . time für Sie, um die grundlegende Frage, die Sie versuchen zu lösen und kommen mit einer radikal anderen Lösung zu besuchen.

Was die corefrage betrifft: transactions können in solchen Iterationen Savepoints verwenden, so dass Iteration 1-4 gespeichert wird (auch wenn Iteration 5 ein Problem trifft und zurückrollen muss). Der Trick ist, bis zu einem Sicherungspunkt zurückzukehren, nicht ganz. Folgen Sie dem gleichen Muster wie bei Exception Handling und Nested Transactions . Beachten Sie, dass nicht jeder Fehler wiederherstellbar ist, einige Fehler erzwingen einen vollständigen Rollback (zB Deadlock ist ein typisches Beispiel).

Die Antwort hier ist nicht 100 Prozent direkt:

Sie werden den dataseiten im memory hinzugefügt, da sie am Ende jeder loop eingefügt werden und wenn ein anderer process mit READ UnCOMITTED oder NO LOCK ausgeführt wurde, dann könnten sie diese Einsätze sehen. Dies heißt Dirty Reads und die Standardisolationsstufe von REAd COMMITED schützt dagegen, aber es bedeutet auch, dass transactions vom Lesen unter dieser Ebene gesperrt werden, bis die Loop abgeschlossen ist.

Allerdings kann SQL server wählen, um die verschmutzten Seiten auf die Disc jederzeit zu spülen. Hiermit meine ich vor dem Ende der Transaktion, am Ende der Transaktion oder nach Abschluss der Transaktion.

Was ist sicher, ist, dass die Schriften an das Transaktionslog am Ende der Transaktion gerötet werden, vor dem Commit. Dies ist, wie SQL server gauruntes data werden nicht verloren gehen im Falle der database nach unten gehen. Dies heißt WAL oder Write Ahead Logging.