Конфликты

Xalet

Well-known member
08.08.2008
410
0
#1
В свойствах форм есть такое поле Conflict handling. В хелпе про него много интересного написано, но на практике получается, что никак эта опция не спасает, конфликты как возникали при одновременном изменении документа разными пользователями(агентами) так и возникают. Что странно. Может я чего-то до конца не настраиваю либо еще что-то?

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

ToxaRat

Чёрный маг
Lotus team
06.11.2007
3 231
17
#2
xalet
самый просто это агент, который раз в день мониторит базу на предмет конфликтов и уведомляет об этом ответственного ;)
 

Xalet

Well-known member
08.08.2008
410
0
#3
самый просто это агент, который раз в день мониторит базу на предмет конфликтов и уведомляет об этом ответственного
Ну тогда можно просто вьюшку с конфликтами сделать... Но это уже как бороться с появившимися... Меня же интересует больше, как избегать появления.
 

ToxaRat

Чёрный маг
Lotus team
06.11.2007
3 231
17
#4
xalet
если это не онлайновые реплики то никак, разве что писать агента, который будет проверять поля по индексам
 
13.03.2009
625
1
#5
Меня же интересует больше, как избегать появления.
а никак. в распределенной среде конфликты(одновременный доступ к ресурсу) есть и будут всегда. про блокировку ресурса написаны тонны литературы.
нужно не бороться с появлением конфликтов, а управлять ими.

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

VladSh

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

Xalet

Well-known member
08.08.2008
410
0
#7
Лучше идти от сути и от причины возникновения конфликтов. Конфликт означает то, что в один и тот же док, произвелась запись более 1-го раза. Всё ещё не так плохо, когда в доке менялись разные поля, тогда можно было бы использовать Merge Conflicts, но такой гарантии дать никто не может (что всегда будут меняться разные поля), поэтому этот вариант отпадает - Lotus, если менялись те же поля, затрёт содержимое ранее изменённого дока более поздним. Это вроде бы и хорошо, но неправильно - допустим один добавил в поле одни телефоны, другой - другие, результат - потеря информации.
Но в том и дело, что даже так не работает. У меня, что бы я не выставил в поле Conflict handling, будь то Merge Conflicts или Do not Create Conflicts, конфликтные документы все равно создаются. Даже если при Merge Conflicts изменяются разные поля.
 

nvyush

Lotus team
22.04.2009
2 317
0
#8
Но в том и дело, что даже так не работает. У меня, что бы я не выставил в поле Conflict handling, будь то Merge Conflicts или Do not Create Conflicts, конфликтные документы все равно создаются. Даже если при Merge Conflicts изменяются разные поля.
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.
 

VladSh

начинающий
Lotus team
11.12.2009
1 260
5
#10
nvy, хорошее описание! Откуда оно (если не секрет)?

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

Klido

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

nvyush

Lotus team
22.04.2009
2 317
0
#12
nvy, хорошее описание! Откуда оно (если не секрет)?
Взял за правило коллекционировать полезную инфу и фрагменты кода, но ссылки на первоисточники по началу не сохранял, так что уже не помню, а гуглить лень.