Lock com SQL Server

09/07/2018

0

Utilizando SQL Server e Delphi, preciso controlar para que em uma certa tabela do banco de dados duas alterações não possam ser feitas ao mesmo tempo no mesmo registro, não posso iniciar o update se já houver outra alteração em andamento. Preciso saber se isso é possível. O cenário é o seguinte: tem-se a tabela TabelaTeste com n registros, e dois terminais de acesso, A e B. Se o terminal A deseja alterar algum dado do registro 1, ele deve adquirir um lock nessa linha, de forma que se o terminal B tentar alterar essa mesma linha ele recebe uma memsagem de erro. Mas alteração de linhas diferentes é permitida.
Para isso consegui obter um certo sucesso. O fluxo é o seguinte atualmente:

1 - Transação iniciada;

2 - Execução de uma query para travar o registro solicitado:
-> 'select * from TabelaTeste with (updlock, nowait) where codigo = :codigo';

3 - Se não der erro ao executar a query acima, o registro está livre e o fluxo continua, senão é gerado um erro e a operação é abortada;

4 - Realizada a operação de update necessária;

5 - Transação é comitada;

Estou tendo problema com a seguinte situação:

1 - Terminal A inicia a alteração da linha 1 dessa tabela;

2 - Terminal B inicia a alteração da linha 2 dessa tabela. Aqui aqui tudo bem, são linhas diferentes;

3 - Terminal A tenta executar seu update (passo nº 4 do esquema acima). Aqui está o problema, enquanto o Terminal B não concluir ou cancelar seu processamento, esse update aqui não será realizado, deixando o usuário esperando;

Se alguém possui algum conhecimento para auxiliar, dizer se é a combinação dos hints que estão sendo utilizados no select, ou se realmente essa situação não é possível.
Túlio Pádua

Túlio Pádua

Responder

Posts

18/07/2018

Luiz Vichiatto

No que entendi da sua aplicação há um LOCK no UPDATE da tabela e não no registro, assim sendo o último a pedir o LOCK é quem determina quando será possível o UPDATE.
Troque o comando por ROWLOCK, e teste novamente.
https://social.msdn.microsoft.com/Forums/pt-BR/5e0152e2-9561-4d8a-9574-35b980df1ef9/no-consigo-fazer-o-bloqueio-de-registro-no-sqlserver?forum=520
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar