Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Доступ к данным / 4 сообщений из 4, страница 1 из 1
08.05.2002, 19:58
    #32029802
Andrey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Доступ к данным
Подскажите новичку.
У меня есть База MSSQL7 в ней таблица + к ней процедуры на добавление,
обнавление, удаление. Клиент написан на Delphi4. Так вот когда я запускаю
клиента на 2-х машинах и пытаюсь отредактировать одну и туже запись у меня
это получается, а хотелось бы чтобы если один клиент редактировал другому
выдовалось сообщение о блокировке записи, как это реализовать.
Заранее большое спасибо.
...
Рейтинг: 0 / 0
09.05.2002, 14:36
    #32029817
Dimos
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Доступ к данным
1. Простое решение
Я бы например завел бы дополнительную таблицу Locks(Record_ID, IS_Locked) или вставил бы поле IS_Locked в исходную таблицу (смотря как у вас база сделана).
При выборе ВСЕХ записей, потенциально доступтых для редактирования, проверял бы поле IS_Locked = 0.
Как только пользователь выбирает запись для редактирования - устанавливал бы IS_Locked = 1
Когда пользователь заканчивает редактирование или же нажимает Cancel - делал бы обратно IS_Locked = 0.

Учтите, что это вещь опасная. А что если программа на стороне пользователя повисла или завершилась неверно? Блокировка записи останется в базе, и придется иметь утилитку, которая чистит все блокировки.

2. Более общее решение
Есть конечно более общий подход - содать таблицу Locks (User_ID, Lock_Type, Lock_Data, Lock_Time, Lock_Expiration) где Lock_Type - тип блокирока (например 1="блокирока редактирования в таблице А", 2-"блокировка генерации отчета X"), Lock_Data - данные для блокировки (например, ID блокируемой записи для Lock_Type=1), Lock_Time - дата/время, когда блокирока была установлена, Lock_Expiration - дада/время когда блокирока должна быть снята НЕЗАВИСИМО НЕ ОТ ЧЕГО (например, вы не хотите блокировать запись дольше чем на 10 минут).

Ну и работать с такой таблицей с помощью, например следующего набора хранимых процедур:
IssueLock(@User_ID, @Lock_Type, @Lock_Data, @Lock_Timeout) - для создания блокировок
RemoveLock(@User_ID, @Lock_Type, @Lock_Date) - для удаления блокировок
(Function) IsLocked(@User_ID, @Lock_Type, @Lock_Data) - для проверки есть ли та или иная блокировка
CleanExpiredLocks() - для очистки "ичтекших" блокировок

Замечание: В IssueLock() Lock_Time = GetDate(), Lock_Expiration = Get_Date + Lock_Timeout
Замечание (2): Процедуру CleanExpiredLocks() надо запускать по schedule периодически чтобы избежать "висящих" блокировок от некорректно работающих программ

Я так делал и с таблицами такого типа работал - очень даже ничего получается.
...
Рейтинг: 0 / 0
09.05.2002, 20:21
    #32029823
Александр Третьяков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Доступ к данным
Я лично добавил к таблице поле useridedit int, по умолчанию оно =0, если пользователь заходит то присваиваю user_id() пользователя, когда заходит другой пользователь ему пишет что заблокировано пользователем user_name(useridedit), а для снятия "зависших блокировок" есть люди которые имеют право снять блокировку (запускают хранимую процедуру). Но выбор за Вами, в свое время я потратил около месяца чтобы определиться и все перепробовать.
...
Рейтинг: 0 / 0
10.05.2002, 04:39
    #32029831
Andrey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Доступ к данным
Где следует запускать процедуру
CleanExpiredLocks() - для очистки "ичтекших" блокировок
на сервере или клиенте если на сервере то как это сделать?
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Доступ к данным / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]