Lock Objects - czegoś tu nie rozumiem...

Jeśli programujesz, administrujesz, integrujesz i masz wątpliwość lub obawę, to właśnie najlepsze miejsce dla Ciebie. Pisz śmiało...
ODPOWIEDZ
emil
Posty: 133
Rejestracja: pt gru 27, 2019 11:02 am
Has thanked: 29 times
Been thanked: 42 times

Lock Objects - czegoś tu nie rozumiem...

Post autor: emil »

Ten temat będzie totalną piaskownicą, ale muszę z kimś przegadać to zagadnienie. Trafiło na Was.

Mój "program" daje możliwość edycji wybranego rekordu. Działa to na zasadzie: wyświetla się ALV, z której przechwytuję nr id rekordu (kliknięcie), przekazuję go do kolejnego programu, w którego PBO zaciągam szczegółowe do formularza, a następnie w PAI zapisuję zmienione informacje do bazy.

Wypadałoby jakoś zabezpieczyć się przed sytuacją, gdy 2ch Userów zacznie mi edytować ten sam rekord ;)
Z pomocą przyszły Lock Objects. Teoretycznie ;)
Opierając się na zapisach dostępnych pod adresem https://www.tutorialspoint.com/sap_abap ... bjects.htm widzę, że "Lock Object is a feature offered by ABAP Dictionary that is used to synchronize access to the same data by more than one program."

Pytanie 1: czy Lock Object działają tylko w przypadku, gdy program Z_ABC1 utworzył blokadę więc nie dopuszcza Z_DEF1, czy może zadziała także w przypadku gdy USER1 uruchomił program Z_ABC1 i edytuje wybrany rekord, a USER2 chce zrobić to samo w tym samym programie (Z_ABC1)?

Opierając się na dostępnych materiałach, utworzyłem sobie własny obiekt, bardzo ładnie wygenerowały mi się dwa moduły funkcyjne.
Zastanawiam się teraz, czy moje rozumowanie jest poprawne jeśli chodzi o sposób ich wykorzystania:

Pytanie 2: Czy dobrze myślę,że powinienem na początku PBO zablokować przez MF rekord (ze wskazaniem ID rekordu do MF), a następnie PO zapisie w PAI zdjąć blokadę drugim MF?
Pytanie 3: Co w takim razie z przypadkiem, gdy ktoś przejdzie przez PBO (utworzy się blokada), ale np przerwie transakcję, wyskoczy/cofnie się (F3) itd? Czy takie zdarzenia też powinienem przechwycić i odpalić w nich MF zdejmujący blokadę?

A może źle rozumiem ideę Lock Objectów?
Na pewno efektem końcowym który chciałbym uzyskać, jest sytuacja w której próba edycji przez Usera1 rekordu w tym momencie edytowanego przez Usera2, zwróci jakiś alert w stylu "ten rekord jest edytowany/zablokowany przez User2".
Daniel
Posty: 2
Rejestracja: śr kwie 01, 2020 11:18 am

Re: Lock Objects - czegoś tu nie rozumiem...

Post autor: Daniel »

Hej,
Generalnie lock'a możesz założyć jedynie na DB.

Pytanie 1: Oczywiście "to zależy" - podczas ustawienia blokady, oprócz klucza możesz wysterować dodatkowymi parametrami. Np _scope. Więcej o tym:
https://www.consolut.com/fileadmin/user ... TEQ_PT.PDF
(strona 10)
Osobiście używam _scope = 1, do zablokowania całego programu przed powtórnym uruchomieniem przez jakieś zewnętrzne zadanie lub osobę.
Także możesz użyć tego parametru aby zablokować dostęp do danego rekordu z innych źródeł (tak chyba najlepiej określić).

Pytanie 2: W najprostszym scenariuszu - tak. Tylko pamiętaj że ID rekordu może nie być wystarczające. Należy zadać tu pytanie, czy za każdym razem wyświetlasz TE SAME dane. Jeżeli mogą być one wyświetlane w różnej kolejności (np poprzez wybór dat) to powinieneś blokować po jakimś kluczu tam występującym, a nie ID rekordu (ew wystarczy też przesortowanie tabeli - i ID Ci się zmieni).

Pytanie 3: Co do zasady również zależy od _scope.
Dla scope = 1, blokada zwalnia się sama po zwolnieniu LUW'a dialogowego. Jak masz przerwanie programu, zwalnia się LUW, zwalnia się blokada.
Dla scope = 2, blokada zwalnia się po UPDATE TASK'u, czyli może być FM at update task, może być commit work / rollback work. Po przerwaniu - blokada może zostać aktywna.
Dla scope = 3 (osobiście nie testowałem) ale dla przerwania powinno zachować się jak dla scope 1

Co do idei - jest właściwa z dokłądnością abyś nie blokował ID, a coś będącego kluczem. Takim kluczem może być jakiś sztuczny obiekt np uuid_32 przypisany do określonej kombinacji wartości.
emil
Posty: 133
Rejestracja: pt gru 27, 2019 11:02 am
Has thanked: 29 times
Been thanked: 42 times

Re: Lock Objects - czegoś tu nie rozumiem...

Post autor: emil »

Daniel pisze: śr kwie 01, 2020 11:49 amCo do idei - jest właściwa z dokłądnością abyś nie blokował ID, a coś będącego kluczem. Takim kluczem może być jakiś sztuczny obiekt np uuid_32 przypisany do określonej kombinacji wartości.
Założyłem, że będę blokować po wartości jednej z kolumn, która to wartość jest unikalna i jest kluczem.
W zasadzie mam dwa pola (kluczowe) które mogę wykorzystać do blokowania: pierwsze zawiera numer/identyfikator wpisywany z ręki (unikalny, sprawdzam, czy taki numer dokumentu został już nadany), oraz drugie pole niezależne od pierwszego, które zasilam w chwili tworzenia rekordu wartością z FM NUMBER_GET_NEXT.
ZETKA
Posty: 69
Rejestracja: czw lis 04, 2010 10:49 pm
Has thanked: 1 time
Been thanked: 71 times
Kontakt:

Re: Lock Objects - czegoś tu nie rozumiem...

Post autor: ZETKA »

Mała uwaga - lock, o którym piszemy, działa na poziomie aplikacji, nie bazy danych.

Obiekt blokowania (moduł funkcyjny ENQUEUE) jako parametry posiada domyślnie pola kluczowe obiektu bazodanowego więc nie da się zablokować czegokolwiek tylko konkretny rekord ;)

Do przeglądu aktualnych blokad - może się przydać - służy transakcja SM12
Pozdrawiam,
Krzysiek
Daniel
Posty: 2
Rejestracja: śr kwie 01, 2020 11:18 am

Re: Lock Objects - czegoś tu nie rozumiem...

Post autor: Daniel »

@ZETKA
- owszem, co wspominałem wyżej.
Jednak:
a) wspomniałem o "sztucznym" kluczu gdzieś zapisanym - czyli w domyśle DB.
b) może to nieeleganckie rozwiązanie, ale kiedyś utworzyłem tabelę Z*X*FAKE która zawierała dany "klucz" tylko po to, aby ustalać taką blokadę na aplikacji. Tabela nie była używana w celu DB, ale dla tej właśnie blokady; jak już stwierdziłem - nie jest to super rozwiązanie, ale działa...
emil
Posty: 133
Rejestracja: pt gru 27, 2019 11:02 am
Has thanked: 29 times
Been thanked: 42 times

Re: Lock Objects - czegoś tu nie rozumiem...

Post autor: emil »

Temat udało się ogarnąć m.in. z Waszą pomocą, dziękuję. :)
ODPOWIEDZ