SQL Server 2008 R2 (WITH - UDPLOCK, ROWLOCK) vs MYSQL (FOR UPDATE)

Pessoal, Bom Dia!

Estou com dificuldade de concorrência no SQL Server.
Sei que no MySQL resolvo utilizando o FOR UPDATE (travando a linha selecionada e executando o Update), evitando que outra pessoa acesse a mesma informação.

Como é no SQL SERVER?!

Pesquisei e verifiquei que preciso utilizar with (rowlock) ou with (updlock) ou with (TABLOCK)… entre outros enfim…
Não consegui atribui essa função de forma que funcionei como o FOR UPDATE do MySQL.

Alguém pode me ajudar com essa solução?!
Existe alguma outra forma que posso resolver esse meu problema?!

Obrigado

Consegui resolver esse problema criando uma procedure (SELECT + UDPATE), funcionou perfeitamente!

De qualquer forma fiquei curioso em saber como utilizar esses comandos no SQL Server (WITH - UDPLOCK, ROWLOCK…)

Valewww Galera!

Bom dia, poderia me ensinar como resolveu?
Estou tendo o mesmo problema e não consegui entender a sua lógica (SELECT + UDPATE)

Agradeço desde já.

André, Boa tarde!

Segue a minha solução que me ajudou, funciona no MySQL ok

SELECT * FROM TbDados FOR UPDATE;

UPDATE Tbdados where Id = 1;

Abraço

Obrigado, mas no SQL Server 2008 não está funcionando, fica dando deadlocked o tempo todo e o ID fica alterando cada vez que eu rodo o UPDATE

  •   $exception	{"Transaction (Process ID 86) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction."}	System.Exception {System.Data.SqlClient.SqlException}

AndreGodoi, como informei o código apresentado é para o MySQL.

SELECT * FROM TbDados FOR UPDATE;

UPDATE Tbdados where Id = 1;

No SQL Server é diferente, eu precisei de ajudando de um amigo DBA, veja o que fiz:

/Inicio - Criar um Procedure/
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

BEGIN TRAN
BEGIN TRY

/Logica selecionar e registrar que está em uso/

UPDATE TbDados SET StStatus = ‘Em Uso’, CdUser = 1 WHERE Id = (SELECT TOP 1 Id FROM TbDados) ;

COMMIT TRAN
END TRY


BEGIN CATCH
ROLLBACK TRAN
END CATCH

SELECT * FROM TbDados Where StStatus = ‘Em Uso’ AND CdUser = 1

/Fim/

Espero que consiga resolver seu problema!

Até mais…