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