C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Как отследить отключение пользователя от сервера
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.
Лично мне больше по душе первый вариант.

Вернуться в Работа с базами данных в C++Builder