Jak zapobiec problemowi z współbieżnością w UPDATE za pośrednictwem iBatis

Nasza aplikacja internetowa Java EE wykonuje operacje na bazach danych przy użyciu iBatis (ORM). Przepływ operacji na bazie danych jest następujący

Pływ : JSP ---> Action ---> ServiceIMpl ---> DaoImpl ----> Wywołanie zapytania o aktualizację przez 'IBatis

Uwaga: Klasy Action, Service i DAO są tworzone przy użyciu techniki Spring Dependency Injection. Używamy Struts2.

Problem: 2 równoczesnych użytkowników wyszukuje ten sam rekord, a użytkownik 1 aktualizuje atrybut1, podczas gdy użytkownik2 aktualizuje atrybut2. Użytkownik 1 najpierw kliknie przycisk „Zapisz”, a następnie użytkownik2 kliknie przycisk Zapisz (podążają za sobą z różnicą kilku sekund). Gdy zobaczymy dane w bazie danych, obecna jest tylko aktualizacja User1. Kolumny Audit pokazują także tylko aktualizację User1. Aktualizacja User2 na Attribute2 nie jest wykonywana, w tym samym czasie nie są zgłaszane wyjątki.

Próbowaliśmy użyć transakcji rozpoczęcia i zatwierdzenia transakcji w iBatis otaczającej wywołanie zapytania aktualizacji zdefiniowanego w pliku xml sqlmap. Ten sam problem nadal występuje. Próbowaliśmy również usunąć te polecenia transakcji, ale problem nadal występuje.

Czy powinniśmy robić coś specjalnego / innego, aby obsługiwać współbieżność podczas aktualizacji? Czy ORM nie lubią obsługiwać iBatis?

Dodatkowe informacje: Dalsze dochodzenie ujawniło następujące informacje.

Gdy użytkownik1 i użytkownik2 kliknie rekord, jego kompletne dane zostaną pobrane do przeglądania.

Teraz, gdy zarówno User1, jak i User2 zmieniają kilka atrybutów i klikają save (jednocześnie), powiedzmy, że pierwsze dane User1 są aktualizowane, a następnie, gdy dane User2 są aktualizowane, już zaktualizowane dane User1 są nadpisane i utracone.

What approach is usually followed in such screens to handle such scenarios ?

questionAnswers(2)

yourAnswerToTheQuestion