6

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 
+5

Gibt es einen Grund, warum Sie nicht 'MERGE' (http://technet.microsoft.com/en-us/library/bb510625.aspx) verwenden können? –

+0

Danke @Ed. Ich hatte keine Ahnung, dass dieser Befehl existiert. Das beantwortet eine Frage. – IamIC

+0

Ok, es war mein Fehler. Na sicher. – IamIC

Antwort

13

Eine Erklärung ...

  • ROWLOCK/ist PageLock Granularität
  • XLOCK ist Modus

Körnigkeit und Isolationsstufe und Modus orthogonal sind.

  • Granularität = was ist gesperrt = Zeile, Seite, Tabelle (PAGLOCK, ROWLOCK, TABLOCK)

  • Isolation Level = Sperre Dauer, Gleichzeitigkeit (HOLDLOCK, READCOMMITTED, REPEATABLEREAD, SERIALIZABLE)

  • Mode = Sharing/Exklusivität (UPDLOCK, XLOCK)

  • "kombiniert" zB NOLOCK, TABLOCKX

XLOCK hätte die Zeile exklusiv gesperrt, wie Sie möchten. ROWLOCK/PAGELOCK hätte nicht.

+0

Danke @gbn. Also "MIT \t (XLOCK, ROWLOCK)" würde den Trick machen :) – IamIC

+0

seltsam MIT (PAGELOCK) hat die Zeile gesperrt. Von dem, was Sie sagen, ich weiß nicht, warum es so wäre. – IamIC

+0

@IanC nein es würde sicherlich nicht den Trick machen - lies meine Antwort oben :) –