Tengo un requisito para rastrear acciones de bloqueo / desbloqueo de objetos. Antes de cualquier acción realizada sobre un objeto (contrato, socio, etc.), lock
se emite un evento. Una vez finalizada la acción, emite el unlock
evento.
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
, b
y 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 INSERT
durante 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 lock
y unlock
mé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 lock
no tuvieron la oportunidad de llamar unlock
para 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 lock
llamada. Al reiniciar el servidor, llamaremos unlock
a 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