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 lock
evento é emitido. Depois que a ação é concluída, ela emite o unlock
evento.
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
, b
e d
.
Minhas perguntas são: - Minha solução é suficiente para evitar conflitos? Existe algum problema que pode ocorrer se houver muitos INSERT
durante 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 lock
e unlock
mé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 unlock
para 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 lock
chamada. 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
fonte