У меня есть требование отслеживать действия по блокировке / разблокировке объектов. Перед выполнением какого-либо действия над объектом (контрактом, партнером и т. Д.) Генерируется 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. Это первый раз, когда я опубликовал вопрос о администраторе БД, и я прошу прощения за то, что не прочитал FAQ.
Спасибо
источник