Eu tenho um requisito para rastrear ações de bloqueio / desbloqueio de objetos. Antes de qualquer ação realizada em um objeto (contrato, parceiro, etc.), um lockevento é emitido. Depois que a ação é concluída, ela emite o unlockevento.
Quero obter os objetos que estão bloqueados, mas ainda não desbloqueados. O objetivo é tornar a consulta rápida e evitar conflitos.
Abaixo está a tabela
create table locks (
id int identity,
name varchar(255),
lock int
)
insert into locks values('a', 1)
insert into locks values('b', 1)
insert into locks values('c', 1)
insert into locks values('d', 1)
insert into locks values('a', 0)
insert into locks values('c', 0)
insert into locks values('a', 1)
insert into locks values('b', 1)
Eu uso a consulta abaixo para objetos ainda não desbloqueados:
select distinct m.name from locks m
where (select COUNT(id) from locks locked
where locked.lock = 1 and locked.name = m.name)
> (select COUNT(id) from locks unlocked
where unlocked.lock = 0 and unlocked.name = m.name)
Funciona correto e resulta a, be d.
Minhas perguntas são: - Minha solução é suficiente para evitar conflitos? Existe algum problema que pode ocorrer se houver muitos INSERTdurante a execução da consulta? - Você tem outra (melhor) maneira de resolver isso?
ATUALIZAR
Peço desculpas por não colocar o contexto em questão. O design do banco de dados acima não serve para substituir o bloqueio do banco de dados.
Temos um sistema externo que chamamos de nosso sistema. Requer chamar locke unlockmétodo em seus sistemas antes de cada ação executada em um objeto (poderia ser um contrato ou um parceiro).
Recentemente, temos situações em que o servidor trava e precisamos reiniciá-lo. Infelizmente, os processos em execução que já chamavamlock não tiveram a chance de chamar unlockpara liberar os objetos, levando a vários outros problemas quando nosso sistema se conectou novamente ao externo.
Portanto, queremos fornecer um recurso para rastrear cada lockchamada. Ao reiniciar o servidor, chamaremosunlock os objetos que foram bloqueados anteriormente.
Obrigado Remus Rusanu por apontar que minha pergunta está usando um protótipo DDL. Esta é a primeira vez que postei uma pergunta no DBA e peço desculpas por não ter lido as Perguntas frequentes.
obrigado