Ich muss die Sperr- / Entsperraktionen von Objekten verfolgen. Vor jeder Aktion an einem Objekt (Vertrag, Partner usw.) wird ein lock
Ereignis ausgegeben. Nachdem die Aktion abgeschlossen ist, wird das unlock
Ereignis ausgegeben.
Ich möchte die Objekte erhalten, die gesperrt, aber noch nicht entsperrt sind. Ziel ist es, die Abfrage schnell zu gestalten und Deadlocks zu vermeiden.
Unten ist die Tabelle
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)
Ich verwende die folgende Abfrage, um noch nicht freigeschaltete Objekte zu objektieren:
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)
Es funktioniert korrekt und Ergebnis a
, b
und d
.
Meine Fragen sind: - Reicht meine Lösung aus, um Deadlocks zu vermeiden? Gibt es ein Problem, das auftreten kann, wenn INSERT
während der Ausführung der Abfrage viele auftreten ? - Haben Sie eine andere (bessere) Möglichkeit, dies zu lösen?
AKTUALISIEREN
Ich entschuldige mich dafür, dass ich den Kontext nicht in die Frage gestellt habe. Das obige Datenbankdesign ersetzt nicht das Sperren von Datenbanken.
Wir haben ein externes System, das wir von unserem System aus nennen. Vor jeder Aktion, die an einem Objekt ausgeführt wird (dies kann ein Vertrag oder ein Partner sein), müssen die Systeme aufgerufen lock
und unlock
methodisiert werden.
In letzter Zeit haben wir Situationen, in denen der Server abstürzt und wir ihn neu starten müssen. Leider hatten die bereits aufgerufenen laufenden Prozesse lock
keine Möglichkeit, unlock
die Objekte freizugeben, was zu mehreren anderen Problemen führte, wenn unser System erneut eine Verbindung zum externen herstellt.
Daher möchten wir die Möglichkeit bieten, jeden lock
Anruf zu verfolgen . Nach dem Neustart des Servers rufen wir unlock
die zuvor gesperrten Objekte auf.
Vielen Dank an Remus Rusanu für den Hinweis, dass meine Frage einen DDL- Prototyp verwendet . Dies ist das erste Mal, dass ich eine Frage zu DBA poste und ich entschuldige mich dafür, dass ich die FAQ nicht gelesen habe.
Vielen Dank
quelle