• 🔥 Бесплатный курс от Академии Кодебай: «Анализ защищенности веб-приложений»

    🛡 Научитесь находить и использовать уязвимости веб-приложений.
    🧠 Изучите SQLi, XSS, CSRF, IDOR и другие типовые атаки на практике.
    🧪 Погрузитесь в реальные лаборатории и взломайте свой первый сайт!
    🚀 Подходит новичкам — никаких сложных предварительных знаний не требуется.

    Доступ открыт прямо сейчас Записаться бесплатно

Предотвращение конфликтов

  • Автор темы Автор темы Kizarek86
  • Дата начала Дата начала

Kizarek86

Green Team
20.07.2007
876
8
Собственно кто как борется с появлением конфликтов в базе?

Конфликты возникают в такой ситуации:

1. 1 документ -
Открыт на чтение - Иванов
Открыт на редактирование - Петров
2.Петров изменяет и сохраняет документ. после чего Иванов переходит в режим редактирования документа, таким образом при сохранении он получит конфликт.

Как боротца?)

Галки объединить конфликты в документе у меня почемуто не пашет....
Переоткрывать документ когда переходим в режим редактирования тоже не лучший вариант, т.к. мелькание происходит...
 
1) В момент перехода в режим редактирования проверить, не изменился ли документ.
2) Если изменился, то переоткрыть его.
Галки пашут для конфликтов репликации.
 
объединение удачно только если оба пользователя не изменили общих полей, т.е. меняли какие-то разные поля, относительно друг друга...
справеливо для репликации, для одновременного редактирования не знаю, не пробовал...
первое и самое главное правило, чтобы не было конфликтов, нужно правильно организовывать рабочий цикл документа таким образом, чтобы не было ситуаций, когда один докнт правится несколькими пользователями в одно время.
т.е. должна быть либо разрозненная возможность вносить исправления, либо должен быть механизм, который будет создавать для каждого пользователя свою копию документа, а потом производить объединение правок в один документ...

а вообще, то нотес должен сам контролировать открытие одного дока на изменение, на одном сервере...
я вот толко не в курсе, это как-то регулируется настройками или он сам по себе... но чаще всего он матюгается, что док-нт уже изменяется другим пользователем и не дает открыть в реж правки другому...
 
А одновременное редактирование и не происходит.
 
Пункт 2. Я думаю, имеется в виду, что Петров закрывает документ, а Иванов переходит в режим редактирования.
 
Akupaka
Вроде не пишу)) Пишу что чтение происходит одновременное)

1) В момент перехода в режим редактирования проверить, не изменился ли документ.
2) Если изменился, то переоткрыть его.
Галки пашут для конфликтов репликации.

Как проверить изменение?)
_tmpdocID := @Text(@DocumentUniqueID);
_tmpField1 := @GetDocField(_tmpdocID,"Field1");
@If(_tmpField1 = Field1;"открываем на редактирование";"переоткрываем")

даже если Field1 было изменено в открытом на чтение документе, то возвращается значение в открытом...т.е. такой конструкцией изменение документа не поймать....
 
написано явно, что документ открывается на изм двумя, т.е. не указано, чтобы Петров закрывал его до того, как Иванов откроет на изм...

Открыт на чтение - Иванов
Открыт на редактирование - Петров
2.Петров изменяет и сохраняет документ. после чего Иванов переходит в режим редактирования документа

проверить можно только взяв документ в бэкгроунде...
 
Сделать можно в Querymodechange. Что-то типа:
Код:
Dim ws As New NotesUIWorkspace
Dim session As New NotesSession
Dim db As NotesDatabase
Dim doc As NotesDocument
Dim uidoc As NotesUIDocument
Dim noteID As String

Set db = session.CurrentDatabase
Set doc = Source.Document
noteID = doc.NoteID
Delete doc
Set doc = db.GetDocumentByID(noteID)

If doc.LastModified > Source.Document.LastModified Then
'документ был изменён. переоткрываем его.
Call Source.Close()
Set uidoc = ws.EditDocument(True, doc, False)
End If
 
а вообще, то нотес должен сам контролировать открытие одного дока на изменение, на одном сервере...
я вот толко не в курсе, это как-то регулируется настройками или он сам по себе... но чаще всего он матюгается, что док-нт уже изменяется другим пользователем и не дает открыть в реж правки другому...
Выдаст сообщение при сохранении, что документ уже был изменен и сохранение приведет к чему-нибудь. Обычно юзеры этих сообщений вообще не читают. Замечено что они на них тыркают правую кнопочку, а если не помогло, то вслед раз левую... А если и это не помогло, то звонят в поддержку.

извинения за оффтоп
 
xalet, не, там как-то появляется сообщение, что документ уже открыт на редактирование пользователем таким-то... и не дает сменить режим...

наверное, это блокировка документов (свойство БД, Allow document locking), если открыть на редактирование док, то будет наложена временная блокировка...
я просто специально этого не исследовал, не уверен на все 100...
 
xalet, не, там как-то появляется сообщение, что документ уже открыт на редактирование пользователем таким-то... и не дает сменить режим...
Так тут как раз случай, что открыли оба документ. Один отредактировал, сохранил и закрыл. Второй в это время читал. Дочитал, тоже отредактировал и сохранил. В таком случае ноутсы выдадут предупреждение и нажав, что согласны, возникнет конфликт сохранения.
 
Всем спасибо, проблема решена переоткрытием)

Medevic
Отдельный респект.
 
немного оффтопа, а в восьмерке уже поправили дебагер? при EditDocument код отлаживать можно в новом открытом окне?..
 
Так тут как раз случай, что открыли оба документ. Один отредактировал, сохранил и закрыл. Второй в это время читал. Дочитал, тоже отредактировал и сохранил. В таком случае ноутсы выдадут предупреждение и нажав, что согласны, возникнет конфликт сохранения.

Интересно, а если включена опция Allow document locking, это также работает?
 
Интересно, а если включена опция Allow document locking, это также работает?

Так же, если оба не будут пытаться залочить документ вначале чтения, что можно сделать в каком-нибудь кьюэри опен. Тогда кто первый начнет читать, тот залочит, а второму выдать соответственно сообщение и закрыть документ. А в кьюэри клоуз соответственно делать разлочивание.
 
Так же, если оба не будут пытаться залочить документ вначале чтения, что можно сделать в каком-нибудь кьюэри опен. Тогда кто первый начнет читать, тот залочит, а второму выдать соответственно сообщение и закрыть документ. А в кьюэри клоуз соответственно делать разлочивание.

Вообще, по идее, если эта опция включена, то должно произойти при переходе в режим редактирования залочивание документа в бэкенде, в базе, который перед этим уже был сохранен другим пользователем, и данные должны бы были быть использованы при редактировании из этого документа...
 
xalet, не, там как-то появляется сообщение, что документ уже открыт на редактирование пользователем таким-то... и не дает сменить режим...

наверное, это блокировка документов (свойство БД, Allow document locking), если открыть на редактирование док, то будет наложена временная блокировка...
я просто специально этого не исследовал, не уверен на все 100...

Soft Locking and Hard Locking
 
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab