Ich habe von SQL Server 2005 auf 2008 aktualisiert. Ich erinnere mich, dass 2005 ROWLOCK einfach nicht funktioniert und ich PAGELOCK oder XLOCK verwenden musste, um jede Art von tatsächlichen Sperren zu erreichen . Ich weiß, ein Leser von diesem wird fragen: "Was hast du falsch gemacht?" Nichts. Ich habe schlüssig bewiesen, dass ich eine "ROWLOCKED" -Reihe bearbeiten konnte, konnte aber nicht, wenn ich die Sperrstufe eskalierte. Ich hatte keine Chance zu sehen, ob dies in SQL 2008 funktioniert. Meine erste Frage ist, ist jemand auf dieses Problem im Jahr 2008 gestoßen?SQL Server ROWLOCK über einen SELECT, wenn nicht existiert INSERT Transaktion
Meine zweite Frage lautet wie folgt. Ich möchte testen, ob ein Wert vorhanden ist, und wenn dies der Fall ist, führen Sie eine Aktualisierung der relevanten Spalten durch und nicht eine Einfügung der gesamten Zeile. Dies bedeutet, dass wenn die Zeile gefunden wird, sie gesperrt werden muss, da ein Wartungsvorgang diese Zeile mitten im Prozess löschen könnte, was zu einem Fehler führen würde.
Um das Prinzip zu veranschaulichen, wird der folgende Code funktionieren?
BEGIN TRAN
SELECT ProfileID
FROM dbo.UseSessions
WITH (ROWLOCK)
WHERE (ProfileID = @ProfileID)
OPTION (OPTIMIZE FOR (@ProfileID UNKNOWN))
if @@ROWCOUNT = 0 begin
INSERT INTO dbo.UserSessions (ProfileID, SessionID)
VALUES (@ProfileID, @SessionID)
end else begin
UPDATE dbo.UserSessions
SET SessionID = @SessionID, Created = GETDATE()
WHERE (ProfileID = @ProfileID)
end
COMMIT TRAN
Gibt es einen Grund, warum Sie nicht 'MERGE' (http://technet.microsoft.com/en-us/library/bb510625.aspx) verwenden können? –
Danke @Ed. Ich hatte keine Ahnung, dass dieser Befehl existiert. Das beantwortet eine Frage. – IamIC
Ok, es war mein Fehler. Na sicher. – IamIC