Welche Transaktionsisolationsstufe sollte ich verwenden, um das Einfügen von data bei der Auswahl von data zu verhindern?

Ich habe drei Tabellen, table A und TableB und Table C

Ich möchte data aus table A lesen und mit table B und das Ergebnis in Table C insert. Ich möchte keine anderen transactions können alle datasätze in table A insert, während ich TablA und Table B. TablA Table B.

Welche isolation level sollte ich verwenden? Ist mit read committed isolation level richtig oder nicht?

Sie fragen die falsche Frage.

Sie sollten keine Einsätze blockieren, warum sollten Sie das tun, besonders in einer gleichzeitigen Umgebung wie Sie beschreiben? Sie sehen nur Blockade und Deadlocks.

Stattdessen sollten Sie fragen, How can I ensure that the join between A and B is consistent ? Das bedeutet, dass die Verknüpfung keinen datasatz während der Verknüpfung eingefügt wird, ohne die Einfügungen zu blockieren. Und die Antwort ist Gebrauch SNAPSHOT ISOLATION .

Mit SNAPSHOT ISOLATION jedes Mal, wenn Sie den Join laufen, sehen Sie nur Zeilen, die bereits begangen wurden, als der Join begann. Zeilen, die eingefügt wurden (in A oder B) nach dem Begleiten, sind nicht sichtbar. So ist der Join immer einheitlich. Wichtig ist, dass du keine Einsätze blockierst, und du wirst auch nicht sperren. Klingt zu gut um wahr zu sein Natürlich gibt es kein kostenloses Mittagessen, Snapshot-Isolation hat eine Kosten, siehe Row Versioning Resource Usage .

Dies ist ein guter Überblick über das Thema: Implementieren von Snapshot oder Lesen Committed Snapshot Isolation in SQL server: Ein Leitfaden .

Nein, gehen Sie für die Serializable-Option, die das Beste in Ihrem aktuellen Szenario ist, da sie verwenden, um zu verhindern, dass der Benutzer neue datasätze hinzufügen, die der Tabelle hinzugefügt werden.

Sie sollten Serializable aus dem MSDN verwenden

"Eine Bereichssperre wird auf dem DataSet platziert, wodurch verhindert wird, dass andere Benutzer Zeilen in das Dataset aktualisieren oder insert, bis die Transaktion abgeschlossen ist."

Weitere Informationen finden Sie unter http://msdn.microsoft.com/en-us/library/system.data.isolationlevel.aspx

Anstatt die Einfügungen zu blockieren, sollten Sie die Snapshot-Isolation für Lesevorgänge verwenden. Auf diese Weise bekommst du einen Punkt-in-time voll konsistenten und stabilen Schnappschuss zu lesen. Gleichzeitige DML stört nicht Ihre Lesungen.

Wenn Sie Einsätze blockieren müssen, ist SERIALIZABLE das Minimum erforderlich. Sie könnten unter Blockierung und Deadlocking leiden. Deshalb empfehle ich Snapshot-Isolation, wenn du es überhaupt benutzen kannst.

Hallo ich werde auch mit Serializable gehen.

 Read uncommitted (the lowest level where transactions are isolated only enough to ensure that physically corrupt data is not read) Read committed (Database Engine default level) Repeatable read Serializable (the highest level, where transactions are completely isolated from one another)* 

Verweise Link, die deutlich zeigen, welche verwendet werden: –

http://technet.microsoft.com/en-us/library/ms189122%28v=sql.105%29.aspx