Ho l'obbligo di tenere traccia delle azioni di blocco / sblocco degli oggetti. Prima di qualsiasi azione eseguita su un oggetto (contratto, partner, ecc.), lock
Viene emesso un evento. Al termine dell'azione, genera l' unlock
evento.
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
, b
e d
.
Le mie domande sono: - La mia soluzione è sufficiente per evitare deadlock? C'è qualche problema che può verificarsi se ce ne sono molti INSERT
durante 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 lock
e unlock
metodo 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 lock
non hanno avuto la possibilità di chiamare unlock
per 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 lock
chiamata. Al riavvio del server, chiameremo unlock
gli 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