J'ai une obligation de suivre les actions de verrouillage / déverrouillage des objets. Avant toute action effectuée sur un objet (contrat, partenaire, etc.), un lock
événement est émis. Une fois l'action terminée, il émet l' unlock
événement.
Je veux obtenir ces objets qui sont verrouillés mais pas encore déverrouillés. Le but est de rendre la requête rapide et d'éviter les blocages.
Ci-dessous le tableau
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)
J'utilise la requête ci-dessous pour objecter les objets non encore déverrouillés:
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)
Cela fonctionne correctement et le résultat a
, b
et d
.
Mes questions sont les suivantes: - Ma solution est-elle suffisante pour éviter les blocages? Y a-t-il un problème qui peut se produire s'il y en a beaucoup INSERT
pendant l'exécution de la requête? - Avez-vous un autre (meilleur) moyen de résoudre ce problème?
MISE À JOUR
Je m'excuse de ne pas avoir mis le contexte dans la question. La conception de la base de données ci-dessus n'est pas destinée à remplacer le verrouillage de la base de données.
Nous avons un système externe que nous appelons de notre système. Il nécessite d'appeler lock
et de unlock
méthode sur leurs systèmes avant chaque action exécutée sur un objet (peut être un contrat ou un partenaire).
Récemment, nous avons des situations telles que le serveur plante et nous devons le redémarrer. Malheureusement, les processus en cours qui ont déjà appelé lock
n'ont pas eu la possibilité d'appeler unlock
pour libérer les objets, ce qui a conduit à plusieurs autres problèmes lorsque notre système se connecte à nouveau à l'extérieur.
Nous voulons donc fournir une capacité de suivre chaque lock
appel. Au redémarrage du serveur, nous invoquerons unlock
les objets précédemment verrouillés.
Merci à Remus Rusanu d'avoir souligné que ma question utilise un prototype DDL. C'est la première fois que je poste une question sur DBA et je m'excuse de ne pas avoir lu la FAQ.
Merci