Tengo un requisito para rastrear acciones de bloqueo / desbloqueo de objetos. Antes de cualquier acción realizada sobre un objeto (contrato, socio, etc.), lockse emite un evento. Una vez finalizada la acción, emite el unlockevento.
Quiero obtener esos objetos que están bloqueados pero aún no desbloqueados. El objetivo es agilizar la consulta y evitar puntos muertos.
Debajo está la tabla
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)
Utilizo la siguiente consulta para objetar objetos aún no 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 correcto y el resultado a, by d.
Mis preguntas son: - ¿Es mi solución lo suficientemente suficiente como para evitar puntos muertos? ¿Hay algún problema que pueda ocurrir si hay muchos INSERTdurante la ejecución de la consulta? - ¿Tienes alguna otra (mejor) forma de resolver esto?
ACTUALIZAR
Pido disculpas por no poner el contexto en la pregunta. El diseño de la base de datos anterior no es para reemplazar el bloqueo de la base de datos.
Tenemos un sistema externo que lo llamamos desde nuestro sistema. Se requiere llamar locky unlockmétodo en sus sistemas antes de cada acción que se realiza en un objeto (podría ser un contrato o un socio).
Recientemente, tenemos situaciones en las que el servidor falla y tenemos que reiniciarlo. Desafortunadamente, los procesos en ejecución que ya llamaron lockno tuvieron la oportunidad de llamar unlockpara liberar los objetos, por lo que provocaron varios otros problemas cuando nuestro sistema se conecta nuevamente al externo.
Por lo tanto, queremos proporcionar una capacidad para rastrear cada lockllamada. Al reiniciar el servidor, llamaremos unlocka los objetos que anteriormente estaban bloqueados.
Gracias a Remus Rusanu por señalar que mi pregunta es usar un prototipo DDL. Esta es la primera vez que publico una pregunta en DBA y pido disculpas por no leer las preguntas frecuentes.
Gracias
fuente
