Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Wie lange gilt ein WITH(UPDLOCK)? (https://www.delphipraxis.net/2899-wie-lange-gilt-ein-updlock.html)

Bart Simpson 12. Feb 2003 14:34


Wie lange gilt ein WITH(UPDLOCK)?
 
Ich arbeite an einem größerem Projekt mit dem M$ SQL Server 2000.
Ich habe dafür einige ziemlich komplexe Stored Procedures geschrieben die viele Tabellen meiner DB bearbeiten.
Nun bin ich auf ein Problem gestossen auf dass ich bisher keine Antwort gefunden hab:
Ich füge innerhalb einer Stored Procedure Daten an eine Tabelle mit einem Statement wie diesem an:

INSERT INTO Tabelle 1 (Feld1,Feld2)
SELECT Feld1, Feld2 FROM Tabelle2

Soweit kein Problem, aber eines meiner Felder ist eine (Integer) ID Spalte, deren neuen Wert ich ermitteln muss:

SELECT COALESCE(MAX(ID)+1,1)AS NewID from Tabelle1

Normalerweise hänge ich daran noch ein WITH(UPDLOCK), damit die Tabelle so lange gesperrt ist, bis ich fertig bin.
Wenn ich das Ganze nun in einen INSERT Aufruf packe ensteht in etwa so was:

INSERT INTO Tabelle 1 (Feld1,Feld2)
SELECT
(SELECT COALESCE(MAX(ID)+1,1)AS NewID from Tabelle1 WITH(UPDLOCK)),
Feld2 FROM Tabelle2

Nun meine Frage: Is das WITH(UPDLOCK) überhaupt nötig, oder ist die Tabelle sowieso gesperrt, weil ich grade ein INSERT ausführen welches wiederum meine neue ID ermittelt?

Wenn's nötig ist: Wie lange gilt das dann? Nur für den INSERT Befehl oder etwa für die ganze Stored Procedure? Letzteres wäre ziemlich blöd, denn die läuft noch _wirklich_ lange weiter und würde mir dann recht viel blockieren...

Irgendeine Ahnung? Wenn ja, kann mir jemand irgendwelche Referenzen zeigen, wo sowas nachzulesen steht? Ich würde das Ganz nämlich irgendwann gern mal verkaufen und dann wäre es gut hier mit "offiziellen" Argumenten zu kommen ;-)
Bin aber auch schon dankbar wenn mir irgendwer was dazu sagen könnte...

Bart Simpson

Sharky 12. Feb 2003 15:07

Re: Wie lange gilt ein WITH(UPDLOCK)?
 
Hmmm.... die Onlinehilfe sagt:

Zitat:

UPDLOCK
Verwendet beim Lesen einer Tabelle Aktualisierungssperren anstelle von gemeinsamen Sperren und erhält Sperren bis zum Ende der Anweisung oder der Transaktion aufrecht. UPDLOCK bietet den Vorteil, dass Sie Daten lesen (ohne andere Leser zu blockieren) und später aktualisieren können und dabei die Gewissheit haben, dass die Daten seit Ihrem letzten Lesevorgang nicht geändert wurden.
Wenn ich das so sehe ist deine Anweisung ja nach dem INSERT INTO beendet. ?

Bart Simpson 12. Feb 2003 15:26

Danke erstmal... das hab ich anscheinend in der Hilfe übersehen :oops:
Aber egal: Darauf kann ich auch nur mit einem klaren "Jein" antworten...

Die große Stored Procedure, die das INSERT ausführt ist extrem lang und manipuliert quer über 10-15 Tabellen hinweg. Deshalb ist das Ganze natürlich an sich schon mal in einer Transaktion verpackt. Heisst das jetzt dass die Tabelle während der ganzen Stored Procedure locked bleibt?

Bart Simpson


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:28 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz