Как контролировать службу Windows (не только статус по умолчанию, но и проверить, работает ли он (работает с таблицей базы данных или нет)) - PullRequest
0 голосов
/ 24 августа 2011

Справочная информация. У меня есть разработанная служба Windows, которая работает каждый день в 12 часов (звонит так и выполняет свою работу).

Теперь у меня есть веб-приложение - одна из его операций - " Чтобы вызвать sp и восстановить данные " (sp - это то же самое, что вызывает служба Windows) Итак, я перед вызовом этого sp из веб-приложения необходимо убедиться, что служба windows не вызывала sp в то время или не работает с этой таблицей БД .. в противном случае могут возникнуть некоторые последствия ..

Как мне достичь этого? Ваша помощь высоко ценится!

Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 24 августа 2011

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

Однако для этого есть законные причины - например, если хранимый процесс потребляет много системных ресурсов.

Я сделал это, создав таблицу «пакетов» примерно следующим образом:

batchid   start_date    end_date   current_status

Когда начинается процесс, он вставляет в эту таблицу запись с конечной датой NULL и"Запущено" current_status;когда он завершается, он обновляет эту запись с end_date и «done» current_status.

Затем вы можете вставить проверку в начале процедуры и сразу же вернуть ее, если найдет запись в таблице «пакетов» с current_status «запущено».

Вы должны убедиться, что все точки выхода из процесса обновляют поле current_status - иначе ваш процесс никогда не запустится после того, как ошибка вызовет прерывание процесса.

Уродливо, но эффективно.

0 голосов
/ 24 августа 2011

Возможно, вы захотите посмотреть на упаковку работы внутри этого хранимого процесса в вызовах sp_getapplock и sp_releaseapplock .

С другой стороны, обычно лучшеисключите все, что требует от вас сериализации доступа к процедуре.


Например:

CREATE PROCEDURE doStuff
AS
    DECLARE @rc int;
    EXEC @rc = sp_getapplock 'doStuff','Exclusive','Session';

    IF @rc < 0 return;

    --Do interesting things

    EXEC sp_releaseapplock 'doStuff', 'Session'
0 голосов
/ 24 августа 2011

Реализация правильной блокировки в базе данных.Либо с помощью блокировки таблицы / строки, либо с помощью пользовательской таблицы заблокированных объектов.

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