Mam dwa pytania, jedno dotyczy Optimistic Lock a drugie Pessimistic.

  1. Optimistic Lock za pomocą adnotacji @Version w klasie encji ma zapobiegać sytuacji w której jeden obiekt encji OE1 związany z danym rekordem nadpisze (updatuje) ten rekord jeżeli został on wcześniej zmieniony przez inną encję OE2 w innym wątku a OE1 nic nie wie o tej zmianie bo jego stan był synchronizowany z tym rekordem przed tą zmianą. Czyli jeżeli dany rekord został zmieniony przez OE2 to podczas wywołania metody "flush()" dla transakcji w której stan OE1 ma zostać spłukany do bazy danych "flush()" spowoduje powstanie OptimisticLockException przez co zmiana się nie dokona a transakcja będzie wycofana. Rekord nie zostanie update'owany.
    Tyle teoria. Mam pytanie o taką sytuację: encja OE1 (z @Version oczywiście) jest zgodna z rekordem pod względem wersji, zmieniamy jaj stan i wywołujemy "flush()" aby zmiana się spłukała do bazy. Spłukanie się dokonuje i w bazie zostaje w tym rekordzie naniesiony niecommittowany upadte. Transakcja encji OE1 dalej dokonuje jakieś czasochłonne operacje. W tym czasie w drugim wątku zaczyna się działanie na encji EO2, mapowanej na ten sam rekord co OE1 tylko pobranej (np. przez find()) wcześniej. Ten drugi wątek (druga transakcja) nie widzi niecommittowanej zmiany w rekordzie więc jego wartośc pola @Version jest zgodna z rekordem. Stan EO2 w drugim wątku zostaje zmieniony (updatowany) i zmiana ta jest przekazywana do bazy przez committowanie transakcji w tym wątku. Rekord został zmieniony. W tym momencie pierwszy wątek też się kończy i commituje swoją transakcję utrwalając wcześniej spłukaną ale niecomittowaną zmianę. Powoduje to nadpisanie zmiany w rekordzie i utratę wpisu dokonanego przez wątek drugi z EO2. Jeżeli dobrze rozumuję to w tym momencie mechanizm Optimistic Lock ma pewna wadę i nie jest w pełni bezpieczny?

  2. Drugie pytanie krótsze. Nie mogę za bardzo zrozumieć z dokumentacji czy Pessimistic Lock blokuje razem z wyznaczonym rekordem inne rekordy z nim powiązane (przez fk) w bazie danych czy też inne obiekty encji powiązane relacją z głównym blokowanym obiektem encji w Persistence Context? Czyli czy blokowanych jest kilka powiązanych rekordów czy też jeden rekord i kilka obiektów encji.