我需要跟踪对象的锁定/解锁动作。在对对象(合同,合作伙伴等)执行任何操作之前,将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
先前锁定的对象。
感谢Remus Rusanu指出我的问题是使用原型 DDL。这是我第一次在DBA上发布问题,对于没有阅读FAQ表示歉意。
谢谢