|
Вопрос # 1 312/ вопрос открыт / |
|
Здравствуйте, уважаемые эксперты!
Я создаю трехзвенную СУБД. Как мне корректно обработать ситуацию, когда два пользователя одновременно пытаются изменить запись? И как обновлять внесенные изменения?
 |
Вопрос задал: Xadoss (статус: Посетитель)
Вопрос отправлен: 4 февраля 2008, 12:22
Состояние вопроса: открыт, ответов: 2.
|
Ответ #1. Отвечает эксперт: Косолапов Дмитрий Юрьевич
Здравствуйте, Xadoss!
Обычно применяются два вида блокировок: оптимистическая и пессимистическая. Принципы их работы такие: при пессимистической блокировке запись блокируется сразу же при первом чтении, соответственно кто первым запись открыл, только тот с ней и работает. Оптимистическая блокировка блокирует данные при записи изменений. В этом случае необходимо проверить перед записью, не изменялась ли запись после ее считывания. Если изменялась, то два варианта (например Access выдает такой вопрос пользователю): либо перезаписать, либо считать измененную запись без сохранения изменений, внесенных этим пользователем.
А вообще, могу порекомендовать отличную книгу по теории СУБД - называется "Системы баз данных, полный курс" авторы Гектор Гарсиа-Молина, Джеффри Ульман и Дженнифер Уидом (издательство Вильямс).
Ответ #2. Отвечает эксперт: Вадим К
Здравствуйте, Xadoss!
Не забываем, что многое придумано до нас. В данном случае также хороши тразакции. Если пользователи поменяли данные так, что они конфликтуют, то транзакцию можно откатить. подробнее читаем здесь, а потом выбираем в зависимости от движка.
Но так как реализуется трёхзвенка, то эту часть можно реализовать и на серверной части. Достаточно применить средства синхнронизации (критические секции к примеру) и не дать двом пользователям одновременно писать.
 |
Ответ отправил: Вадим К (статус: Академик)
Время отправки: 4 февраля 2008, 22:55
|
Мини-форум вопроса
Всего сообщений: 4; последнее сообщение — 6 февраля 2008, 21:02; участников в обсуждении: 2.
|
Xadoss (статус: Посетитель), 5 февраля 2008, 09:03 [#1]:
А как корректно обновлять данные, чтоб вносимые изменения клиентом сохранялись на сервере и чтоб другие клиенты увидели эти изменения? Я пишу на Делфи. Для локального сохранения использую команду post (для сохранения данных у клиента), а для сохранения изменений на сервере ApplyApdates.
|
|
Вадим К (статус: Академик), 5 февраля 2008, 23:59 [#2]:
О, если бы вы описали, какой именно технологией вы пользуетесь. А то телепаты снова в отпуске.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Xadoss (статус: Посетитель), 6 февраля 2008, 16:32 [#3]:
База данных Interbase, технология удаленного доступа сокеты
|
|
Вадим К (статус: Академик), 6 февраля 2008, 21:02 [#4]:
что то у меня не сходиться в голове ваше первое и второе сообщение.
Поэтому наверно в вашем случае лучше использовать блокировки. Перед тем, как пользователь хочет изменить данные, он ставит блокировку. Если в этот момент ещё кто то схочет изменить данные, то он проверив блокировку, откажеться. Правда тут есть одно маленькое но. Человек может открыть данные на редактирование (заблокировав их) и уйти на часик. В таком случае есть два решение - либо организационные (длина блокировок записывается в отдельный файл. если они длинее какого то времени и в этот момент кто то пытался ещё блокировать - штраф). либо проще - если человек заблокировал, но окно не закрывает - оно автоматом закроется и разблокирует через определённое время.
Галочка "подтверждения прочтения" - вселенское зло.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|