オブジェクトのロック/ロック解除アクションを追跡する必要があります。オブジェクト(契約、パートナーなど)に対するアクションの前に、lock
イベントが発行されます。アクションが終了すると、unlock
イベントが発行されます。
ロックされているがまだロック解除されていないオブジェクトを取得したい。目標は、クエリをすばやく作成し、デッドロックを回避することです。
以下は表です
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)
以下のクエリを使用して、まだロック解除されていないオブジェクトをオブジェクト化します。
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)
それは正しく動作し、結果a
、b
そしてd
。
私の質問は次のとおりです。-私のソリューションはデッドロックを回避するのに十分ですか?INSERT
クエリの実行中に大量にある場合、問題が発生する可能性はありますか?-これを解決する他の(より良い)方法はありますか?
更新
コンテキストを質問に入れなかったことをお詫び申し上げます。上記のデータベース設計は、データベースロックを置き換えるものではありません。
システムから呼び出す外部システムがあります。オブジェクト(契約またはパートナーである可能性があります)で実行する各アクションの前に、システムで呼び出しlock
てunlock
メソッドを実行する必要があります。
最近、サーバーがクラッシュし、サーバーを再起動する必要がある場合があります。残念ながら、すでに呼び出されている実行中のプロセスは、オブジェクトを解放するlock
ために呼び出す機会がなかったため、unlock
システムが外部のオブジェクトに再度接続するときに、他のいくつかの問題が発生しました。
したがって、各lock
呼び出しを追跡する機能を提供したいと考えています。サーバーを再起動したら、unlock
以前にロックしたオブジェクトを呼び出します。
私の質問はプロトタイプ DDL を使用していることを指摘してくれたRemus Rusanuに感謝します。DBAに質問を投稿したのは今回が初めてで、FAQを読んでいないことをお詫びします。
ありがとう