Witam,
nie wiem jak ugryźć pewien problem, tzn wiem jak mogę sobie z nim poradzić ale nie jestem pewny czy nie ma lepszych i sprawdzonych sposobów, dlatego będę wdzięczny za wszelkie opinie i wskazówki. Poniżej opiszę dwa problemy. Z pierwszym niedługo się zmierzę a drugi muszę rozwiązać.
Problem 1: Wyobraźcie sobie, że piszecie aplikację, która będzie służyć do układania grafików dla pracowników (to tylko przykład). Kierownicy poszczególnych działów i inne osoby do tego wyznaczone (nie jest to jedna osoba) mogą układać i edytować grafiki.
Osoba A wybiera pewnego pracownika, któremu edytuje grafik na miesiąc marzec. Po kliknięciu na link zawierający jego imię i nazwisko, wchodzi w tryb edycji grafiku tej osoby. Widzi cały miesiąc i może dokonywać zmian godzinowych dla poszczególnych dni, a po dokonaniu zmian, naciska przycisk "weryfikuj". Sprawdzane są warunki i jeśli wszystko jest ok, może zapisać zmiany. Jeśli nie są spełnione pewne zalezności, wyświetlany jest odpowiedni komunikat. Pomimo błędów osoba ta i tak może świadomie zapisać taki "błędny" grafik.
Edycja takiego grafiku czy samo dodawanie nowego dla pracownika zajmuje trochę czasu. Problemem jest to, że druga osoba może chcieć w tym samym czasie edytować lub dodać grafik dla tej samej osoby. Może się trochę zdenerwować, jeśli okaże się, że układała grafik 20minut i podczas próby zapisania do bazy otrzyma komunikat, że grafik już istnieje (osoba B już go dodała) i można go tylko edytować.
Pomyślałem, że dobrze byłoby blokować tabele a konkretnie użytkowników, którzy są w danym momencie dodawani albo edytowani. Ale samo blokowanie raczej nie spełni moich oczekiwań. Dlaczego? Nie jestem pewny (muszę to sprawdzić ale teraz nie mam chwilowo dostępu do bazy) ale czy z blokowaniem tabel nie jest tak, że jak skrypt php kończy się wykonywać to blokady są zdejmowane?
Jeśli tak nie jest, tylko można z poziomu php ustawić blokady w bazie do odwołania, to co będzie jeśli użytkownik zamknie przeglądarkę podczas edycji i pójdzie sobie gdzieś? Nikt nie może edytować ani dodać takiego pracownika, ponieważ teoretycznie jest on edytowany/dodawany przez inną osobę..
Jak sobie poradzić z tym problemem?
Problem 2:
Załóżmy że w bazie istnieją jakieś produkty. Możemy z poziomu aplikacji php dodawać nowe, edytować je i usuwać. Usuwanie odbywa się w następujący sposób:
- wybieramy opcję usuń produkt
- z listy rozwijanej wybieramy nazwę produktu i klikamy usuń (za pomocą $_POST przesyłamy sobie id produktu do usunięcia).
Osoba A wybiera z listy rozwijanej produkt do usunięcia ale nie naciska przycisku usuń, bo... np zadzwonił telefon:)
W między czasie osoba B usunęła ten produkt. Osoba A skończyła rozmawiać i naciska przycisk "usuń". I... łapiemy wyjątek SQL...
Ja uważam (i tak przyjąłem pisząc aplikację), że wyjątek krytyczny (myślę tu o wyjątkach sql) to coś co powinno przerwać pracę aplikacji.
Problem ten mógłbym rozwiązać poprzez sprawdzanie (przed samym zapytaniem usuwającym produkt) czy ten produkt istnieje nadal. Ale... może się zdarzyć (mało prawdopodobieństwo ale jest to możliwe a muszę to uwzględnić), że od sprawdzenia czy produkt istnieje a do jego usunięcia, ktoś ten produkt zdąży usunąć. I znowu mamy wyjątek SQL.
Macie jakieś pomysły?
Pozdrawiam