Valdemar |
Отправлено: 03.11.2004, 10:12 |
|
Мастер участка
Группа: Участник
Сообщений: 433
|
Есть БД в Firebird. Пользователь считывает из БД документ (транзакция только для чтения), затем, если надо, вносит изменения в него и делает запись в БД. Необходимо сделать так, чтобы другой пользователь, при открытии этого же документа, получил сообщение, что этот документ редактируется другим пользователем и изменять его пока нельзя. Для этого я решил добавить в таблицу, описывающую документ, поля с именем пользователя, редактирующего документ, и время. При открытии документа с возможностью редактирования проверяется не занят ли документ другим пользователем и если не занят, то документ открывается и записывается информация о пользователе. После закрытия документа информация о пользователе удаляется. Проблема в том, что при нештатных ситуациях (зависание компьютера, сбои питания) в таблице останется информация о том, что документ занят.
Вопрос в том, можно ли на уровне сервера Firebird 1.5 отследить аварийное отключение пользователя от БД?
Как альтернативу решения этого вопроса можно сделать дополнительную программку, которая будет постоянно запущена на машине с сервером БД и должна проверять, подтвердила ли пользовательская программа свое соединение с БД обновив информацию о времени. Если разница между временем последнего подтверждения и текущим временем превышает допустимый предел, то значит пользователь, редактировавший документ, аварийно отключился и информацию о нем надо удалить.
Но меня все таки интересует возможность отслеживания отключения пользователя на уровне сервера. |
|
AVC |
Отправлено: 03.11.2004, 10:45 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
Требует уточнения для FB
По первому пункту.
Лучше всего применять пессимистическую блокировку записи — это примерно тоже что вы эмулируете, но выполняемое сервером. Но сервер должен поддерживать неблокирующее чтение.
По второму.
Я вижу следующие пути решения — прослушивающая программа (listener) для отлова "мертвых" сессий и периодическое подтверждение связи (как в протоколе NetBios).
Listener применяет Oracle. Разновидность второго варианта встречалась при работе с Sybase через ADO.
Лично мне больше по душе первый вариант. |
|
|