Механизм блокировки между процессами на нескольких машинах - PullRequest
6 голосов
/ 04 февраля 2010

У меня есть приложение C # с NHibernate, которое должно выполнять некоторые операции над БД SQL Server.

Наша цель - запустить это приложение несколько раз на одной и той же машине, а также на других машинах.

На самом деле приложение вставляет строку в таблицу SQL и проверяет, является ли первая строка с минимальной датой строкой с правильным PID и именем машины, поэтому приложение устанавливает блокировку и выполняет работу.

У нас есть проблемы с этой логикой, потому что приложение должно также удалить блокировку других приложений, если приложение, сохраняющее блокировку, разбилось.

Есть ли подсказка об изменении архитектуры блокировки?

Проблема в том, что приложение может работать на нескольких машинах.

Ответы [ 2 ]

3 голосов
/ 04 февраля 2010

Как насчет управления блокировкой в ​​БД? У вас может быть таблица / хранимая процедура, в которой регистрируется каждый запущенный экземпляр, получает уникальный идентификатор и использует хранимую процедуру для блокировки и освобождения. (Та же методика, что и предотвращение нескольких входов в систему для одного пользователя с нескольких машин).

2 голосов
/ 04 февраля 2010

Или

Я реализовал это обоими способами.

Автономные блокировки могут работать с базами данных, но есть вероятность, что вы можете ввести перегрузку, если слишком много процессов постоянно ожидает блокировки (хотя приличный сервер БД должен кэшировать информацию). Кроме того, убедитесь, что вы используете уровень изоляции транзакций ReadCommited при выполнении каких-либо действий с этой таблицей, и будьте готовы к взаимоблокировкам

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...