6

He actualizado de SQL Server 2005 a 2008. Recuerdo que en 2005, ROWLOCK simplemente no funcionaba y tuve que usar PAGELOCK o XLOCK para lograr cualquier tipo de bloqueo real . Sé que un lector de esto preguntará "¿qué hiciste mal?" Nada. Demostré concluyentemente que podía editar una fila "ROWLOCKED", pero no podría si aumentara el nivel de bloqueo. No he tenido la oportunidad de ver si esto funciona en SQL 2008. Mi primera pregunta es si alguien se ha encontrado con este problema en 2008.SQL Server ROWLOCK sobre un SELECCIONAR si no existe INSERT transacción

Mi segunda pregunta es la siguiente. Quiero probar si existe un valor y, de ser así, realizar una actualización en columnas relevantes, en lugar de una inserción de toda la fila. Esto significa que si se encuentra la fila, debe bloquearse, ya que un procedimiento de mantenimiento podría eliminar esta fila a mitad del proceso, lo que provocaría un error.

Para ilustrar el principio, ¿funcionará el siguiente código?

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

¿Hay algún motivo por el que no pueda usar 'MERGE' (http://technet.microsoft.com/en-us/library/bb510625.aspx)? –

+0

Gracias @Ed. No tenía idea de que existiera el comando. Eso responde una pregunta. – IamIC

+0

Bien, fue mi error. Por supuesto. – IamIC

Respuesta

13

Una explicación ...

  • ROWLOCK/PageLock es granularidad
  • XLOCK modo es

granularidad y nivel de aislamiento y el modo son ortogonales.

  • Granularidad = lo que está bloqueado = fila, página, mesa (PAGLOCK, ROWLOCK, TABLOCK)

  • nivel de aislamiento = duración del bloqueo, concurrencia (HOLDLOCK, READCOMMITTED, REPEATABLEREAD, SERIALIZABLE)

  • Mode = compartir/exclusividad (UPDLOCK, XLOCK)

  • "combinado", por ej. NOLOCK, TABLOCKX

XLOCK habría bloqueado la fila exclusivamente como lo desee. ROWLOCK/PAGELOCK no tendría.

+0

Gracias @gbn. Entonces "CON \t (XLOCK, ROWLOCK)" haría el truco :) – IamIC

+0

extrañamente con (PAGELOCK) cerró la fila. Por lo que dices, no sé por qué lo hubiera hecho. – IamIC

+0

@IanC sin duda no funcionaría - lee mi respuesta anterior :) –

Cuestiones relacionadas