Przejdź do treści

Współbieżna edycja danych

Współbieżna edycja danych

1. Opis mechanizmu i jego zastosowanie

W serwerze Neos wprowadzono mechanizm, który zabezpiecza przed współbieżną edycją tego samego dokumentu przez wielu użytkowników. Mechanizm ten pozwala na zakładanie blokad na rekordy w celu uniemożliwienia ich edycji, gdy są już edytowane przez innego użytkownika. Jest to szczególnie istotne w przypadku pracy zespołowej, gdzie kilka osób może pracować nad tym samym dokumentem jednocześnie, co mogłoby prowadzić do konfliktów i utraty danych.

Mechanizm jest przeznaczony do działania niezależnie od liczby instancji serwera Neos pracujących u klienta. Oznacza to, że blokada założona na jednym serwerze jest respektowana na innych instancjach.

2. Konfiguracja na obiekcie biznesowym

Aby mechanizm blokowania działał automatycznie na obiekcie biznesowym, należy zaimplementować metodę GetLockId(TModel model). Metoda ta powinna zwracać unikalny identyfikator (lockId) na podstawie danego rekordu. Na przykład:

Dla obiektu NAGZAM:

protected override string GetLockId(TModel model)
{
    if (model.REF is null) return "";
    return "ZAMOWIENIE" + model.REF;
}

Dla obiektu POZZAM:

protected override string GetLockId(TModel model)
{
    if (model.ZAMOWIENIE is null) return "";
    return "ZAMOWIENIE" + model.ZAMOWIENIE;
}

Dzięki temu, edycja jednego obiektu (np. nagłówka zamówienia) automatycznie blokuje edycję powiązanych obiektów (np. pozycji zamówienia).

Uwaga!

Podczas implementacji metody GetLockId(TModel model) należy upewnić się, że wszystkie używane w niej pola są prawidłowo uzupełnione. Najczęstszym przypadkiem jest dodawanie nowego rekordu, gdzie klucz główny może jeszcze nie być przypisany w modelu. W takiej sytuacji, aby nie blokować procesu dodawania nowych rekordów, metoda powinna zwracać pusty lockId, jak pokazano w przykładach powyżej.

3. Programowe korzystanie z mechanizmu

Mechanizm blokowania udostępnia trzy główne metody: - GUI.SetLock(lockId) – Zakłada blokadę na rekord o identyfikatorze lockId. Jeśli nie uda się założyć blokady, metoda rzuca wyjątek. - GUI.RemoveLock(lockId) – Usuwa blokadę o identyfikatorze lockId. - GetLockId(model) – Metoda do zwracania unikalnego lockId na podstawie modelu (aktualnego rekordu). Można ją przeciążyć, aby dostosować identyfikator do potrzeb aplikacji.

Dostępna jest również bezparametryczna metoda GetLockId(), która wewnętrznie wywołuje przeciążoną metodę GetLockId(TModel model) z aktualnym rekordem jako argumentem.

Przykładowe użycie w kodzie:

var lockId = this.GetLockId() // Na przykład "REKORD_123"
try 
{
    GUI.SetLock(lockId);
    // Operacje na rekordzie
}
finally
{
    GUI.RemoveLock(lockId);
}

4. Technikalia i zarządzanie lockami

Blokady są przechowywane w bazie danych w tabeli SYS_LOCKS i są identyfikowane za pomocą UserUUID, co oznacza, że blokada jest przypisana do użytkownika niezależnie od klienta, z którego korzysta. Procedury BD SYS_SETLOCK oraz SYS_REMOVELOCK zarządzają zakładaniem i zdejmowaniem blokad.

Jeśli serwer Neos zostanie niespodziewanie wyłączony, w bazie danych mogą pozostać nieaktywne blokady. W takich przypadkach blokady starsze niż 24 godziny są automatycznie czyszczone przez procedurę SYS_CLEARSYSLOCKS, która jest uruchamiana okresowo. W razie potrzeby administrator może ręcznie wyczyścić blokady za pomocą dedykowanego okna zarządzania blokadami dostępnego w interfejsie Neos.

W przypadku potrzeby usunięcia blokady (bez dekrementowania licznika), można zastosować odpowiednie parametry w procedurze RemoveLock.