Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 1 312

/ вопрос открыт /

Здравствуйте, уважаемые эксперты!
Я создаю трехзвенную СУБД. Как мне корректно обработать ситуацию, когда два пользователя одновременно пытаются изменить запись? И как обновлять внесенные изменения?

Xadoss Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Xadoss (статус: Посетитель)
Вопрос отправлен: 4 февраля 2008, 12:22
Состояние вопроса: открыт, ответов: 2.

Ответ #1. Отвечает эксперт: Косолапов Дмитрий Юрьевич

Здравствуйте, Xadoss!
Обычно применяются два вида блокировок: оптимистическая и пессимистическая. Принципы их работы такие: при пессимистической блокировке запись блокируется сразу же при первом чтении, соответственно кто первым запись открыл, только тот с ней и работает. Оптимистическая блокировка блокирует данные при записи изменений. В этом случае необходимо проверить перед записью, не изменялась ли запись после ее считывания. Если изменялась, то два варианта (например Access выдает такой вопрос пользователю): либо перезаписать, либо считать измененную запись без сохранения изменений, внесенных этим пользователем.

А вообще, могу порекомендовать отличную книгу по теории СУБД - называется "Системы баз данных, полный курс" авторы Гектор Гарсиа-Молина, Джеффри Ульман и Дженнифер Уидом (издательство Вильямс).

Ответ отправил: Косолапов Дмитрий Юрьевич (статус: 8-ой класс)
Время отправки: 4 февраля 2008, 22:32

Ответ #2. Отвечает эксперт: Вадим К

Здравствуйте, Xadoss!
Не забываем, что многое придумано до нас. В данном случае также хороши тразакции. Если пользователи поменяли данные так, что они конфликтуют, то транзакцию можно откатить. подробнее читаем здесь, а потом выбираем в зависимости от движка.
Но так как реализуется трёхзвенка, то эту часть можно реализовать и на серверной части. Достаточно применить средства синхнронизации (критические секции к примеру) и не дать двом пользователям одновременно писать.

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 4 февраля 2008, 22:55


Мини-форум вопроса

Всего сообщений: 4; последнее сообщение — 6 февраля 2008, 21:02; участников в обсуждении: 2.
Xadoss

Xadoss (статус: Посетитель), 5 февраля 2008, 09:03 [#1]:

А как корректно обновлять данные, чтоб вносимые изменения клиентом сохранялись на сервере и чтоб другие клиенты увидели эти изменения? Я пишу на Делфи. Для локального сохранения использую команду post (для сохранения данных у клиента), а для сохранения изменений на сервере ApplyApdates.
Вадим К

Вадим К (статус: Академик), 5 февраля 2008, 23:59 [#2]:

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

Xadoss (статус: Посетитель), 6 февраля 2008, 16:32 [#3]:

База данных Interbase, технология удаленного доступа сокеты
Вадим К

Вадим К (статус: Академик), 6 февраля 2008, 21:02 [#4]:

что то у меня не сходиться в голове ваше первое и второе сообщение.

Поэтому наверно в вашем случае лучше использовать блокировки. Перед тем, как пользователь хочет изменить данные, он ставит блокировку. Если в этот момент ещё кто то схочет изменить данные, то он проверив блокировку, откажеться. Правда тут есть одно маленькое но. Человек может открыть данные на редактирование (заблокировав их) и уйти на часик. В таком случае есть два решение - либо организационные (длина блокировок записывается в отдельный файл. если они длинее какого то времени и в этот момент кто то пытался ещё блокировать - штраф). либо проще - если человек заблокировал, но окно не закрывает - оно автоматом закроется и разблокирует через определённое время.
Галочка "подтверждения прочтения" - вселенское зло.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:59
Выполнено за 0.03 сек.