Конфликты

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

  1. Xalet

    Xalet Well-Known Member

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

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

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

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

    Xalet Well-Known Member

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

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

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

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

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

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

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

    Xalet Well-Known Member

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

    nvyush Lotus team
    Lotus team

    Регистрация:
    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

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

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

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

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

    Klido Гость

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

    nvyush Lotus team
    Lotus team

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

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