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
¿Hay algún motivo por el que no pueda usar 'MERGE' (http://technet.microsoft.com/en-us/library/bb510625.aspx)? –
Gracias @Ed. No tenía idea de que existiera el comando. Eso responde una pregunta. – IamIC
Bien, fue mi error. Por supuesto. – IamIC