Tenho um módulo IIS que atende a várias requisições ao mesmo tempo. Na entrada de cada requisição, quero registrar a última vez que o serviço foi acessado:
update log set last_access = getdate()
Mas com o nível de simultaneidade que às vezes consigo ter, tenho medo de facilmente ter conflitos.
Como meu log não precisa de uma precisão de milissegundos (ele será consultado para verificar se o servidor foi acessado nos últimos X minutos, não milissegundos), então, se meu log enfrentar um conflito, ele pode perfeitamente ignorar esse log e simplesmente não fazer nada.
Minha ideia inicial era proteger meu registro dentro de um bloco try-catch e simplesmente ignorar os conflitos.
begin try
update log set last_access = getdate()
end try
begin catch
-- We do nothing and ignore that another request has logged an access at the same time
end catch
Mas isso está correto?. Em caso de conflito, pularei automaticamente para a seção catch, não faça nada, para que meu Backend possa continuar atendendo normalmente o restante da requisição?.
Receio que ele possa esperar o deadlock ser liberado e continuar após um timeout. Existe uma maneira melhor de atualizar um valor, enquanto diz ao SQL Server para simplesmente ignorar essa atualização se outra sessão já tiver feito isso ao mesmo tempo?
PS: este log de atualização será executado em sua própria transação, enquanto qualquer operação SQL necessária para atender à solicitação será executada em transações separadas.
Obrigado.