Ich muss zuerst (sagen wir mal) 10000 Zeilen in der Datenbank auswählen und sie zurückgeben. Möglicherweise gibt es mehrere Clients, die diese Operation gleichzeitig ausführen. Ich habe diese Frage gestellt:
%Vor%Es ist eine Operation, die aus Update und geschachtelter Auswahl besteht. Beide Abfragen arbeiten in derselben Tabelle (tblRedir). Die Idee ist, dass die Zeilen zuerst durch eine eindeutige batchId markiert und dann über
zurückgegeben werden %Vor%(Die Batch-ID ist eine eindeutige Kennung (z. B. Zeitstempel oder GUID) für jede dieser Aktualisierungen)
Meine Frage:
Ich dachte, dass die Operation mit geschachteltem Select atomar ist - das bedeutet, dass jeder Client seine eigenen Daten erhält, die eindeutig sind (kein anderer Client hat eine Teilmenge seiner Daten erhalten).
Allerdings sieht es so aus, als ob ich falsch liege - in einigen Fällen gibt es Clients, die keine Daten erhalten, weil sie wahrscheinlich zuerst beide die Auswahl ausführen und dann beide ausführen update (der erste Client hat also keine markierten Zeilen).
Ist diese Operation atomar oder nicht?
Ich arbeite mit Sql Server 2005. Die Abfrage wird über NHibernate wie folgt
ausgeführt %Vor% SELECT
setzt gemeinsame Sperren für die gelesenen Zeilen, die dann im READ COMMITED
Isolationsmodus aufgehoben werden können.
UPDATE
speichert die aktualisierten Sperren später in exklusive Sperren. Sie werden erst am Ende der Transaktion aufgehoben.
Sie sollten die Sperren beibehalten, sobald sie platziert werden.
Sie können dies tun, indem Sie die Transaktionsisolationsstufe REPEATABLE READ
festlegen, die die freigegebenen Sperren bis zum Ende der Transaktion behält und verhindert, dass UPDATE
part diese Zeilen sperrt.
Alternativ können Sie Ihre Abfrage wie folgt neu schreiben:
%Vor%, wodurch die gesperrten Zeilen einfach übersprungen werden.
Tags und Links sql sql-server concurrency nhibernate