Stworzyłem serwer pośredniczący, do którego klienci wysyłają żądania CRUD a on operuje na bazie, jednocześnie powiadamiając pozostałych klientów o zmianach w danym rekordzie. Jeśli ktoś dodaje rekord, zostają powiadomieni o tym inni i odświeżają dane. Jeśli ktoś modyfikuje dane inni tracą taką możliwość w stosunku do danego rekordu. Serwer co minutę odpytuje klientów czy "żyją". Jeśli tak a edycja trwa więcej niż 5 minut rekord zostaje automatycznie odblokowany. Wydaje mi się, że to jedyne najszybsze i najbezpieczniejsze rozwiązanie. Serwer i klienci komunikują się za pomocą gniazd, wykorzystując nieblokujące połączenia.
Kiedyś napisałem program kliencki niewymagający serwera. Klienci operowali bezpośrednio na bazie danych. Każda tabela posiadała kolumnę edit, do której swoją nazwę zapisywał każdy użytkownik, który edytował dany rekord a po zakończeniu ustawiał jej wartość na "no" (typ char). Inni rozpoznawali po tym czy możliwe są operacje na nim. Każda modyfikacja zostawała zapisywana do specjalnej tabeli zawierającą nazwę tabeli i id rekordu oraz nazwą użytkownika. Klient sprawdzał za pomocą Timer'a (co 5 sek) czy id tej tabeli wzrosło, jeśli tak odczytywał wartości i uzyskiwał w ten sposób informację co się dzieje. A dalej już wiadomo. Niestety takie podejście jest dość niechlujne, powolne i mimo wszystko niebezpieczne dla danych.
Tu jest nie jeden, ale kilka antywzorców i morderstwo zasobów zamiast porządnej inżynierii.
W dodatku wykazałeś niewiedzę o lepszych rozwiązaniach 1), które zastępujesz gorszymi "jak się małemu Jasiowi wydawało".
Dalej będziesz, jak socjalizm, dzielnie rozwiązywał problemy nieznane w innych projektach
- np optimistic locking (już pominę, że mogłeś go wykorzystać) zostawia w bazie timestamp/version
PS. Też jestem za kolejkami komunikatów, O ILE nadal będzie je potrzebował.