Блокировка документов

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
466
Используется много длл-ек. а если в новой версии какой-то не будет?
Не ясно, как разруливается одновременность попыток залочить
если сервак перезагрузится а у клиента открыт док - блокировка слетит
каких длл нет, это родных доминошных?
дык в QS код вставить
 

Gandliar

Lotus Team
16.02.2004
564
26
BIT
110
так он же сам лочится - без твоего участия, зачем этот код?
лочится софтлоком, если в ини не стоит параметр, а в то же время кто то (например сервер) выполняет действие - без хард лока не отследить залочен или нет
 

Gandliar

Lotus Team
16.02.2004
564
26
BIT
110
Пока мне больше всего нравится сохранять блокировки в соседней базе.
а) не надо хранить ничего в текущем документе
б) быстрый поиск по документа в базе блокировок
в) уникальное сохранение блокировочного документа при одновременных попытках
г) удобный вид в базе блокировок для админа (если чего разблокировать вдруг)

опробую на большом количестве одновременных пользователей, отпишу.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
466
если слетит сервер общая память похерится
не понял ...
если слетит сервер - накроется ваша база блокировок и будут траблы с восстановлением и "разблокировкой"
что вам до памяти, если сервер раздачи блокировок упал? И что ценного хранится в общей памяти, персистент для блокировок вреден чем полезен
я не вижу проблемных сценариев с блокировками на очередях, сравнивая с любыми другими
 

ToxaRat

Чёрный маг
Green Team
06.11.2007
3 332
42
BIT
0
лочится софтлоком, если в ини не стоит параметр, а в то же время кто то (например сервер) выполняет действие - без хард лока не отследить залочен или нет
не совсем понял, как только перевёл док в редактирование стандартными средствами то сервер уже знает что док залочен
 

Gandliar

Lotus Team
16.02.2004
564
26
BIT
110
не совсем понял, как только перевёл док в редактирование стандартными средствами то сервер уже знает что док залочен
если под стандартными средствами понимается режим редактирования , то сервер может и знает а скрипт нет
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
466
С одинаковым унидом второй документ не сохраняется в базе
поиск по базе осущ. в конкурентном режиме, представим сто два пользователя с разных ПК открывают док, у первого комп медленный, он получает пустой индекс (т.е. нет блокировки) и пока открывает док, второй тоже получает пустой индекс и тоже открывает док, имеем коллизию
 
  • Нравится
Реакции: VladSh

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
466
г) удобный вид в базе блокировок для админа (если чего разблокировать вдруг)
"если чего может быть массовым", при ошибке скрипта (обработки документа) удаление из базы не произойдет
 

alexas1

Green Team
10.04.2014
1 202
225
BIT
43
... второй тоже получает пустой индекс и тоже открывает док, имеем коллизию
- если перед открытием обязательно блокировать док от своего имени, что произойдёт только при отсутствии ошибки при записи дока в базу (здесь уже нет попытки получить док по ключу) - коллизии не будет
но MQ всё равно лучше - быстродействием и отсутствием мусора в базе (за которым надо всё равно следить)
удобный вид в базе блокировок для админа (если чего разблокировать вдруг)
зачем ЭТО админу? если надо снять блокировку, админ, "по админски", просто открывает заблокированный док на редактирование, без восстановления записи в очередь и всё -
все админские действия всё равно предпринимаются после возникновения конкретного гемора
список текущих блокировак не даст инфы о "зависших" блокировках
 
Последнее редактирование:

VladSh

начинающий
Lotus Team
11.12.2009
1 797
158
BIT
232
если под стандартными средствами понимается режим редактирования , то сервер может и знает а скрипт нет
Скрипт работает на сервере, потому и скрипт тоже знает - заблокировать такой док из скрипта не удастся.
 

VladSh

начинающий
Lotus Team
11.12.2009
1 797
158
BIT
232
Создаем очередь с именем юнид, производим операции, если ч-л при создании очереди не является владельцем (т.е. очередь существует) - док залочен
Если на сервере 2 агента, подписанные сервером, одновременно вцепились в документ, кто будет его владельцем? Можно передать ещё и владельца?

Чем философствовать, лучше бы уже код готовый для блокировок привели :)
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
466
Если на сервере 2 агента, подписанные сервером, одновременно вцепились в документ, кто будет его владельцем?
там по коду (класса) видно - первый получивший очередь будет её владельцем, второй просто получит объект не чета не то...,
Код:
    Sub New(MQName As String)
        Dim status As Integer
        misOwner=True
        mAutoClose=True
        mName=Trim( mqName)
        If Len(mName)>0 Then
            status= apiMQCreate(mName,NOPRIORITY,0)
            If status=ERR_DUPLICATE_MQ Then misOwner=False
            apiCall "MQOpen", apiMQOpen(mName,0,hMQ)
        Else
            Error 1024+110,"MessageQueue name is empty string…"
        End If
    End Sub
агент успевший создать очередь и станет владельцем
Код:
   Dim queue As New NotesMessageQueue(UNID)
   if queue.isOwner Then
   'do something
   ...
   Else
   'document is locked'
   End If
 
Последнее редактирование:

Gandliar

Lotus Team
16.02.2004
564
26
BIT
110
Код:
%REM
    Function block_create
    Description: Пробует создать блокировку. В случае успеха возвращает true.
    В случае raiseError=true, в случае ошибки возвращает диалогбокс с содержанием ошибки
%END REM
function block_create(doc As NotesDocument, raiseError As Boolean) As Boolean
    Dim session As New NotesSession
    'Инициализируем базу блокировок
    Dim dbBlock As NotesDatabase
    If Not init(dbBlock, doc, raiseError) Then Exit Function
    'Пробуем блокировать
    Dim flagError As Boolean
    Dim docBlock As NotesDocument
    Set docBlock = dbBlock.Createdocument()
    On Error 4000 GoTo errHandler_4000
    GoSub processDocBlock
m:
    If Not flagError Then
        'Успешно заблокировали
        block_create = True
        Exit Function
    End If
    'Заблокировать не удалось
    On Error 4091 Resume Next
    Set docBlock = dbBlock.Getdocumentbyunid(doc.Universalid)
    If Not docBlock Is Nothing Then
        'Нашли блокировку, значит заблокирован
        Dim nn As NotesName
        Set nn = New NotesName(docBlock.userName(0))
        If raiseError Then MessageBox "Документ заблокирован пользователем "+nn.Abbreviated, 16, "Операция прервана!"
        Exit Function
    End If   
    'Блокировку не нашли
    If raiseError Then MessageBox "Документ заблокировать не удалось, попробуйте еще раз!", 16, "Операция прервана!"   
ex:
    Exit Function
    
errHandler_4000:
    'Такой unid уже есть в базе данных
    flagError = true   
    Resume m
    
processDocBlock:
    With docBlock
        .universalId = doc.universalId
        .server = doc.parentDatabase.Server
        .replicaId = doc.parentDatabase.Replicaid
        .title = doc.parentDatabase.Title
        .filePath = doc.parentDatabase.filePath
        .userName = session.Effectiveusername               
        Dim item As NotesItem
        Set item = .Getfirstitem("userName")
        item.Isauthors = True
        Call .Save(True, True)               
    End With   
    Return   
End Function
 

Gandliar

Lotus Team
16.02.2004
564
26
BIT
110
Код:
%REM
    Function block_destroy
    Description: Пробует отменить блокировку. В случае успеха возвращает true.
    В случае raiseError=true, в случае ошибки возвращает диалогбокс с содержанием ошибки
%END REM
Function block_destroy(doc As NotesDocument, raiseError As Boolean) As Boolean
    'Инициализируем базу блокировок
    Dim dbBlock As NotesDatabase
    If Not init(dbBlock, doc, raiseError) Then Exit Function
    Dim docBlock As NotesDocument
    On Error 4091 Resume Next
    Set docBlock = dbBlock.Getdocumentbyunid(doc.Universalid)
    If Not docBlock Is Nothing Then
        'Нашли блокировку, значит заблокирован
        Call docBlock.Remove(true)
    End If   
    block_destroy = true
End Function
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
466
@Gandliar мне не кажется такой механизм надежным ;), время установки и снятия блокировки ощутимое
dbBlock.Getdocumentbyunid(doc.Universalid) не всегда работает как ожидается ;)
 

Gandliar

Lotus Team
16.02.2004
564
26
BIT
110
@Gandliar мне не кажется такой механизм надежным ;), время установки и снятия блокировки ощутимое
Надежность и время понятия разные :)

28237
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
466
задолбал движок форума, никуа нельзя запостить, ошибки на ровном месте
Код:
Function GetDocumentByUNIDSilent(db As NotesDatabase, UNID As String) As NotesDocument

    On Error GoTo ErrH

    If Len(UNID)<>32 Then GoTo Quit

    Dim doc As NotesDocument

    Set doc = db.GetDocumentByUNID(UNID)

    If doc.IsValid And Not doc.IsDeleted Then

        'проверка - если, например, недоступен по readers

        If doc.Size > 0 Then

            Set GetDocumentByUNIDSilent = doc

        End If

    End If   

Quit:

    Exit Function

ErrH:

'    RaiseError

    Resume Quit

End Function
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!