Grundagen-Frage zu Locks

01/06/2008 - 13:36 von Marian Aldenhövel | Report spam
Hallo,

Ich komme mir doof vor, aber bekanntlich gibt es keine dummen Fragen (Ha!).

Kurzfassung: Können Clients beim SQL-Server lesend zugreifen obwohl andere
Clients gerade aktualisieren und noch nicht comitted haben, und können sie
dabei noch die Original-Daten lesen?

Gegeben ist eine Installation von SQL Server 2005 Express mit einer Datenbank
und einer simpel-Tabelle:

CREATE TABLE TestTabelle (
ID uniqueidentifier NOT NULL,
Text varchar(50) NULL,
CONSTRAINT PK_TestTabelle PRIMARY KEY (ID)
)
GO

INSERT INTO TestTabelle (ID,Text) VALUES (newid(),'Wert')
GO

Client A verbindet sich mit dieser DB und sagt:

BEGIN TRANSACTION
GO

UPDATE TestTabelle SET Text='Geàndert' WHERE Text='Wert'
GO

Und comitted erstmal nicht, der ist faul. Client B verbindet sich und
sagt:

BEGIN TRANSACTION
GO

SELECT * FROM TestTabelle
GO

Der guckt jetzt in die Röhre. Bevor A seine Transaktion nicht irgendwie
beendet muss er warten oder aufgeben.

Ich verstehe (inzwischen) warum das so ist, bin aber mit der Gesamtsituation
unzufrieden.

Ich kann nun auch Client B

SELECT * FROM TestTabelle WITH (NOLOCK)

abfragen lassen, hebele aber damit jede Transaktionsisolation aus, auch
nicht schön.

Gibt es echt keine Möglichkeit B die Originaldaten aus TestTabelle lesen
zu lassen ohne auf das Commit zum UPDATE von A warten zu müssen?

Hintergrund: Ich möchte Standardlogik zum pessimistischen Locking umsetzen.

Der User blàttert in seinen Daten. Findet einen Datensatz, den er àndern
möchte. Er klickt auf "Ändern". Macht seine Änderungen. Klickt irgendwann
auf "Speichern" oder "Abbrechen" und darf hinreichend sicher sein seine
Änderungen auch un die DB zu bekommen.

Andere User sollen ungehindert weiter den Datenbestand lesen können.

Aber natürlich soll kein anderer User auf demselben Datensatz "Ändern"
klicken dürfen. Tut er es doch will ich an der Stelle einen Fehler haben,
optimistisches Locking (aka einfach kein Locking ;-)) will ich also nicht
betreiben.

Das Beispiel ist in der Praxis natürlich nicht das Riesenproblem, aber
ich bin gerade dabei die Basisfunktionalitàt des Clientprogramm durchzusehen
und zu definieren.

Momentan bin ich ein wenig unglücklich darüber und will mein Firebird oder
Oracle wiederhaben :-).

Ciao, MM
Marian Aldenhövel, Rosenhain 23, 53123 Bonn
http://www.marian-aldenhoevel.de
"Success is the happy feeling you get between the time you
do something and the time you tell a woman what you did."
 

Lesen sie die antworten

#1 Hannes Brunner
01/06/2008 - 14:04 | Warnen spam
Hallo Marian,

Marian Aldenhövel schrieb:
Hallo,

Ich komme mir doof vor, aber bekanntlich gibt es keine dummen Fragen (Ha!).

Kurzfassung: Können Clients beim SQL-Server lesend zugreifen obwohl andere
Clients gerade aktualisieren und noch nicht comitted haben, und können sie
dabei noch die Original-Daten lesen?



guck mal hier rein:
http://technet.microsoft.com/de-de/...77404.aspx

Gruß
Hannes

Ähnliche fragen