2010-10-15 6 views
5

Ich habe eine Situation wie diese.Welche Isolationsstufe wird verwendet, um zu verhindern, dass Daten gelesen werden?

Abfrage ist wie folgt.

Select * from TABLE where ID = 1 

(was für eine Abfrage :)

nach, dass ich ändern Sachen in dieser Zeile und fügen Sie ihn mit neuen ID.

Ich möchte verhindern, dass andere Abfragen diese erste ursprüngliche Zeile von Abfrage lesen, bis ich das Lesen und Einfügen fertig bin. Danach ... geh voraus.

Grundsätzlich möchte ich auswählen und einzufügen in der Transaktion sein, mit Isolationsstufe, die das Lesen nur aus dieser Zeile verhindert, bis das Einfügen abgeschlossen ist.

OleDbTransaction im Spiel ist, weil ich SQL Server 6.5 (oh ja Sie es richtig lesen, fragen Sie nicht, warum :)

Ich war Graben durch Beschreibung Isolationsstufen, aber nicht ganz ihnen und Lösung finden verstehen für mein Problem, also meine Frage ist, welche Isolationsstufe für OleDbTransaction zu verwenden?

Hoffnung, ich war klar :)

Danke.

Antwort

-1

Sie müssen die Zeile sperren: Erstellen Sie die Sperre, bevor Sie die Zeile lesen, und geben Sie die Sperre frei, nachdem Sie die Zeile aktualisiert haben.

In Oracle und ähnliche Datenbanken, liest nicht sperren kann, so müssen Sie die folgenden (in einer Transaktion) tun:

SELECT * FROM table WHERE id=? FOR UPDATE 
... 
UPDATE table .... 

In MS SQL, ich bin nicht wirklich sicher, Der einfachste Weg wäre, folgendes zu versuchen: Öffnen Sie zwei mit der Datenbank verbundene Fenster, starten Sie eine Transaktion in beiden, machen Sie SELECT und sehen Sie, ob Sie die Auswahl aus der zweiten vornehmen können. Wenn die Anweisung nicht zurückkehrt, bedeutet das, dass die Zeile gesperrt ist und Sie gut sind.

Ich gehe davon aus, in Ihrer Frage, meinen Sie zu Update die Zeile, nachdem Sie es ausgewählt haben, nicht einfügen es (Einfügen erstellt eine neue Reihe, Update ändert eine vorhandene Zeile)

+0

nutzlose Antwort, weil grundlegende Isolationsstufe in MS SQL loser ist als eine in Oracle – Andrey

+0

-1 Warum haben Sie für Oracle, wenn es SQL Server ist, zu antworten, und dann erwähnen Sie nicht Wissen Sie es auch? – gbn

+0

Erstens könnte jemand im Internet auf diese Seite stoßen und Oracle benutzen, also dachte ich, ich könnte es genauso gut einbeziehen; Zweitens könnte es in SQL Server ähnlich sein, so dass es ein Zeiger in die richtige Richtung sein könnte. –

0

Umgebungsbeschreibung heißt Phantom Read. Sie brauchen also Serializable Isolation (SERIALIZABLE)

+0

Warum wurde dies abgelehnt? – Andrey

+0

Zuerst habe ich diese Isolationsstufe, und dann einige andere, aber in jedem Fall habe ich Fehler, sagen, dass andere Prozess, select select Abfrage ausgeführt wird in Deadlock gefangen, und wurde Opfer von Deadlock und abgebrochen. Scheint so, als ob diese Sache mit Isolationsstufen nicht meine Lösung ist oder ich etwas falsch mache. – 100r

5

Sie müssen die Sperre die Dauer einer Transaktion halten. Und exklusiv auch.

Jetzt bin ich mir der richtigen Optionen für SQL Server 6.5 nicht sicher. Haben Sie nicht mit ihm gearbeitet, da er, 199x

BEGIN TRAN 

--edit, changed to XLOCK, ROWLOCK, HOLDLOCK 
SELECT * from TABLE WITH (XLOCK, ROWLOCK, HOLDLOCK) where ID = 1 
... 
INSERT 

COMMIT 

Edit:

Meine Änderung (mit feiner Granularität) bis zum Ende der die Transaktion ausschließlich die einzelne Zeile sperren soll.

Allerdings wurde IIRC ROWLOCK mit SQL Server 7 hinzugefügt und 6.5 war nur Seitensperren. Aber es ist eine Weile her. Ich hatte damals Haare und Zähne :-)

+0

Ich darf keine Tabellensperre verwenden. weil es immer sehr schwere Queris gibt, und TABLOCKX ist Tabellensperre richtig? – 100r

+0

Siehe Update – gbn

+0

tnx. Ich konnte keine Schlösser funktionieren lassen. Abfrage wird nicht kompiliert. vielleicht 6,5 sintax ist anders. Ich werde es am Montag bei der Arbeit versuchen, Gott sei Dank, ich habe 6.5 zu Hause nicht :) – 100r

Verwandte Themen