Ho l'obbligo di tenere traccia delle azioni di blocco / sblocco degli oggetti. Prima di qualsiasi azione eseguita su un oggetto (contratto, partner, ecc.), lockViene emesso un evento. Al termine dell'azione, genera l' unlockevento.
Voglio ottenere quegli oggetti che sono bloccati ma non ancora sbloccati. L'obiettivo è rendere la query rapida ed evitare deadlock.
Di seguito è la tabella
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)
Uso la query seguente per obiettare oggetti non ancora sbloccati:
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)
Funziona correttamente e risulta a, be d.
Le mie domande sono: - La mia soluzione è sufficiente per evitare deadlock? C'è qualche problema che può verificarsi se ce ne sono molti INSERTdurante l'esecuzione della query? - Hai qualche altro (migliore) modo per risolverlo?
AGGIORNARE
Mi scuso per non aver inserito il contesto nella domanda. La progettazione del database sopra non è per la sostituzione del blocco del database.
Abbiamo un sistema esterno che lo chiamiamo dal nostro sistema. Richiede di chiamare locke unlockmetodo sui loro sistemi prima di ogni azione eseguita su un oggetto (potrebbe essere un contratto o un partner).
Di recente, abbiamo situazioni tali che il server si arresta in modo anomalo e dobbiamo riavviarlo. Sfortunatamente, i processi in esecuzione che già hanno chiamato locknon hanno avuto la possibilità di chiamare unlockper rilasciare gli oggetti, portando quindi a molti altri problemi quando il nostro sistema si ricollega a quello esterno.
Quindi vogliamo fornire la possibilità di tracciare ogni lockchiamata. Al riavvio del server, chiameremo unlockgli oggetti precedentemente bloccati.
Grazie a Remus Rusanu per aver sottolineato che la mia domanda sta usando un prototipo DDL. Questa è la prima volta che ho pubblicato una domanda su DBA e mi scuso per non aver letto le FAQ.
Grazie