SQL Server «Проверка таблицы базы данных, если в таблице идет процесс» - PullRequest
2 голосов
/ 02 июля 2010

Что я хочу сделать, так это сообщить пользователям о моей программе, что «в базе данных происходит обновление, поэтому результаты могут быть неверными».Таким образом, я должен проверить, есть ли какой-нибудь процесс (например, запись или удаление) в моей таблице, который использует моя программа.

Редактировать: Я обновляю свою таблицу, используя MS Access, копирую из MS Excell около 10.000 строк и вставляю ее в базу данных с помощью MS Access.Поэтому, когда копирование выполняется, я хочу видеть его из моей веб-программы.

Спасибо.

Ответы [ 3 ]

3 голосов
/ 02 июля 2010

Я не уверен, что понимаю, чего вы здесь добиваетесь.

SQL Server управляет целостностью и согласованностью ваших данных за вас, при условии, что вы используете подходящий уровень изоляции.

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

Подробнее см .: Уровни изоляции транзакций

0 голосов
/ 03 июля 2010

Обновление, re:

"Редактировать: я обновляю свою таблицу, используя MS Access, я копирую из MS Excell около 10.000 строк и вставляю ее в базу данных с помощью MS Access. Поэтому, когда идет копирование, я хочу быть Я могу видеть это из моей веб-программы. "

Принцип тот же, в начале процесса вставки добавьте строку БД, как в моем первом ответе. Или вы можете установить глобальную переменную в вашем веб-приложении, например, updateInProgress = true.

Но как долго длится эта копия? Если это менее 5 минут, то, вероятно, больше ничего не стоит делать.

Если вы просто хотите, чтобы пользователь знал, что есть «свежие» данные, вы можете запросить данные о последних датах.


Что за обновление? В обычном смысле SQL Server обеспечивает точность результатов с блокировкой транзакций по умолчанию.

Может быть, вы имеете в виду долгую работу по импорту данных? Или, не дай Бог, какой-нибудь интенсивный, управляемый курсором процесс?

Тогда вы могли бы сделать что-то вроде:

  1. Создать таблицу в базе данных. Позвони, скажи LongJobLog. Он может иметь 3 столбца: идентификатор, дату и время начала и дату и время окончания.

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

  3. Когда задание завершится или произойдет ошибка, обновите строку идентификатора с указанием времени окончания.

  4. Ваше приложение будет запрашивать у этой таблицы последние строки (по времени начала), которые все еще имеют нулевое время окончания. Если такие строки существовали, выполняется обновление.

  5. Вам, вероятно, понадобится задание cron, чтобы очистить записи о сбоях заданий.

В качестве альтернативы, эта информация о запуске и остановке, вероятно, доступна в журналах SQL. Хотя, чтобы разобраться, может потребоваться немного работы.

0 голосов
/ 02 июля 2010

Создайте где-нибудь общий счетчик (в процессе или на сервере, в файле или в общей памяти и т. Д.).Делайте ваши обновления, как это

increment the counter
query(UPDATE blablabla)
decrement the counter

Затем вы показываете сообщение, если счетчик больше 0.

(Но это то, что вы действительно хотите? Смотрите комментарий)

...