1. Наш канал codeby в telegram. Пишем об информационной безопасности, методах защиты информации, о программировании. Не пропускай новости с кодебай, будь в тренде ! Подробнее ...

    Скрыть объявление

Конфликты

Тема в разделе "Lotus - Программирование", создана пользователем Xalet, 17 дек 2009.

  1. Xalet

    Xalet Well-Known Member

    Репутация:
    0
    Регистрация:
    8 авг 2008
    Сообщения:
    410
    Симпатии:
    0
    В свойствах форм есть такое поле Conflict handling. В хелпе про него много интересного написано, но на практике получается, что никак эта опция не спасает, конфликты как возникали при одновременном изменении документа разными пользователями(агентами) так и возникают. Что странно. Может я чего-то до конца не настраиваю либо еще что-то?

    Ну и собственно суть вопроса: кто как борется с возникновением конфликтов в системах, в которых много пользователей через реплики работают с одними и теми же документами в базе?
     
  2. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Репутация:
    0
    Регистрация:
    6 ноя 2007
    Сообщения:
    3.195
    Симпатии:
    24
    xalet
    самый просто это агент, который раз в день мониторит базу на предмет конфликтов и уведомляет об этом ответственного ;)
     
  3. Xalet

    Xalet Well-Known Member

    Репутация:
    0
    Регистрация:
    8 авг 2008
    Сообщения:
    410
    Симпатии:
    0
    Ну тогда можно просто вьюшку с конфликтами сделать... Но это уже как бороться с появившимися... Меня же интересует больше, как избегать появления.
     
  4. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Репутация:
    0
    Регистрация:
    6 ноя 2007
    Сообщения:
    3.195
    Симпатии:
    24
    xalet
    если это не онлайновые реплики то никак, разве что писать агента, который будет проверять поля по индексам
     
  5. turumbay

    Репутация:
    0
    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    а никак. в распределенной среде конфликты(одновременный доступ к ресурсу) есть и будут всегда. про блокировку ресурса написаны тонны литературы.
    нужно не бороться с появлением конфликтов, а управлять ими.

    - почитайте про св-во формы "conflict handling"
    - попробуйте изменить логику приложения: если один документ одновременно может редактироваться в разных местах, но редактируются разные части документа - можно дробить документы на более мелкие.
    - в некоторых ситуациях конфликты можно предовратить включением блокировок.
     
  6. VladSh

    VladSh начинающий
    Lotus team

    Репутация:
    0
    Регистрация:
    11 дек 2009
    Сообщения:
    1.248
    Симпатии:
    2
    xalet
    Лучше идти от сути и от причины возникновения конфликтов. Конфликт означает то, что в один и тот же док, произвелась запись более 1-го раза. Всё ещё не так плохо, когда в доке менялись разные поля, тогда можно было бы использовать Merge Conflicts, но такой гарантии дать никто не может (что всегда будут меняться разные поля), поэтому этот вариант отпадает - Lotus, если менялись те же поля, затрёт содержимое ранее изменённого дока более поздним. Это вроде бы и хорошо, но неправильно - допустим один добавил в поле одни телефоны, другой - другие, результат - потеря информации.
    Поэтому генерация конфликтов - это самый верный способ сохранения информации.
    Если о возникновении конфликтов будет уведомлять админа агент, то это никак не спасает, т.к. админ может (а в большинстве случаев так и бывает) не иметь должной квалификации, чтобы определить, которая информация является правильной и актуальной; некоторые же документы вообще не предполагают того, чтобы их смотрел админ...
    Т.е. что мы имеем (условия задачи):
    - надо сохранять информацию;
    - надо сохранить возможность изменений документов в репликах разных серверов;
    и при этом как-то обойтись без конфликтов...
    Скажу честно - это самая интересная задача, которая стоит перед проектировщиком приложений под Lotus, и много тут никто не расскажет, т.к. это как раз и есть сердце любой серьёзной системы, построенной на LND.
    В кратце:
    Есть 2 пути решения:
    1. Анализ конфликтов (даже программно).
    2. Недопущение конфликтов. Ключ к решению этой задачи в ограничении, накладываемом механизмом конфликтов - необходимо сделать так, чтобы документ физически изменялся только в одном месте.
    Есть 2 основных варианта недопущения их возникновения; условно их назовём так:
    1. Архитектурный (если рассматривать в лоб, то это создание новых версий документов).
    2. Программный (тут полёт для фантазии сумасшедший...).
    Обычно это микс из этих 2-х вариантов (исходя из достоинств, недостатков вариантов и личных предпочтений).
    В принципе инфа здесь вся, а дальше только шурупать головой :)
    Скажу только, что на Лотус написать серьёзную систему без конфликтов можно. Главное - не стараться написать подобие EPR, когда нужны гарантированные изменения нескольких документов сразу (типа Commit). В пределах одного сервера это мы проходили... - оно того не стоит. Каждая система должна решать те задачи, для которых она предназначена.
     
  7. Xalet

    Xalet Well-Known Member

    Репутация:
    0
    Регистрация:
    8 авг 2008
    Сообщения:
    410
    Симпатии:
    0
    Но в том и дело, что даже так не работает. У меня, что бы я не выставил в поле Conflict handling, будь то Merge Conflicts или Do not Create Conflicts, конфликтные документы все равно создаются. Даже если при Merge Conflicts изменяются разные поля.
     
  8. nvyush

    nvyush Well-Known Member
    Lotus team

    Репутация:
    0
    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Conflict handling влияет только на вновь создаваемые документы. В уже созданных документах за это отвечает поле
    $ConflictAction
    Create Conflicts (создавать конфликты). Выбор этого значения вызывает безусловное создание
    конфликтных документов при конфликте репликации/сохранения. Сохранение документа, созданного
    по форме с данной опцией, не вызывает появление в документе предопределенного поля
    $ConflictAction;
    • Merge Conflicts (объединять конфликты). Если в разных репликах пользователи редактировали
    различные поля, то при репликации эти значения объединятся в одном документе без возникновения
    конфликта. Если редактируется одно и тоже поле в разных репликах, то конфликт все же возникает.
    Сохранение документа, созданного по форме с данной опцией, вызывает появления в документе
    предопределенного поля $ConflictAction со значением " 1 " ;
    • Merge/No Conflicts (объединять или отвергать конфликты). Если в разных репликах пользователи
    редактировали различные поля, то при репликации эти значения объединятся в одном документе без
    возникновения конфликта. Если редактируется одно и тоже поле в разных репликах, то конфликт не
    возникает, а документ, который должен был бы стать конфликтным (см. таблицу выше) просто не
    сохраняется. Сохранение документа, созданного по форме с данной опцией, вызывает появление в
    документе предопределенного поля $ConflictAction со значением "3";
    • Do Not Create Conflicts (не создавать конфликты). При данном выборе конфликты вообще не
    создаются. Сохранение документа, созданного по форме с данной опцией, вызывает появление в
    документе предопределенного поля $ConflictAction со значением "2".
    Важное замечание - предопределенное поле $ConflictAction не меняет своего значения в ранее
    созданных документах после изменения свойств формы и повторного сохранения документа. Исключение
    составляет только случай, когда этого поля в документе не было (соответствует значению Create
    Conflicts). Здесь поле $ConflictAction появляется в документе со значением, соответствующим опции
    формы. Таким образом, если изменить свойства формы и даже пересохранить затем ранее созданные
    документы, то при репликации эти документы будут обрабатываться в соответствии со старыми
    значениями параметров обработки конфликтов. Если требуется изменить такое поведение, то следует
    написать агента, изменяющего значение поля $ConflictAction.
     
  9. Xalet

    Xalet Well-Known Member

    Репутация:
    0
    Регистрация:
    8 авг 2008
    Сообщения:
    410
    Симпатии:
    0
    Спасибо. Попробую покапать в этом направлении.
     
  10. VladSh

    VladSh начинающий
    Lotus team

    Репутация:
    0
    Регистрация:
    11 дек 2009
    Сообщения:
    1.248
    Симпатии:
    2
    nvy, хорошее описание! Откуда оно (если не секрет)?

    Только ещё тонкость одна с $ConflictAction. Это поле может возникнуть в реальном документе, а не в конфликте. От чего это зависит может от направления репликации или ещё чего, я не знаю... При разборе конфликтов (программном в т.ч.) оригиналом является тот, у которого дата создания раньше.
    Это обнаружилось когда ссылки начали рушиться при удалении доков с полем $ConflictAction.
     
  11. Klido

    Klido Гость

    Репутация:
    0
    VladSh
    ну это один из случаев конфликтных комбинаций...когда основной становится конфликтом к конфликту...
    более познавательны конфликты "сам на себя" и "конфликты ни на что" :)
     
  12. nvyush

    nvyush Well-Known Member
    Lotus team

    Репутация:
    0
    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Взял за правило коллекционировать полезную инфу и фрагменты кода, но ссылки на первоисточники по началу не сохранял, так что уже не помню, а гуглить лень.
     
Загрузка...

Поделиться этой страницей