Zapobieganie duplikatow, MyDac, sockety

0

Kiedys pisałem tutaj, ale zgubilem watek.
Wiec jeszcze raz przedstawie problem, moze ktos pomoze mi nad koncepcja:

W celu synchronizacji N-baz danych, przesylam socketami tresci tych zapytan do poszczegolnych klientow, ktorzy wykonuja to zapytanie. Kazde odebranie zapytania jest potwierdzane i dopiero wtedy serwer usuwa to zapytanie z kolejki, ze juz wyslal tam gdzie mial i jest OK.
I tu jest problem, ktory juz mi sie zdarzyl pare razy: jak ustrzec sie gdy zagubi sie po drodze potwierdzenie klienta do serwera ? Serwer wtedy przesyla jeszcze raz tresc zapytania i gdy jest to INSERT, to u klienta wyskoczy wyjatek duplikatu klucza glownego...
Obralem metode Execute w blok Try, i w finally odeslanie potwierdzenia, ale czy to powinno wystarczyc ?

0

Możesz rozpocząć coś na wzór transakcji między klientem, a serwerem. Tzn. serwer wysyła "BEGIN TRAN" i poszczególne zapytania. Klient sobie wszystkie wykonane zapytania zapisuje gdzieś i przy odbiorze nowego sprawdza, czy to zapytanie już wykonał, czy nie. Potem na końcu klient otrzymuje komunikat "END TRAN" i czyści tą listę. Oczywiście ma to też swoje minusy. Rozważmy przypadek:


-- zapytanie 1 z serwera wykonane przez klienta
update tabela SET
   pole = 5
where id = 1

-- zapytanie 2 z serwera wykonane przez klienta
update tabela SET
   pole = 3
where id = 1

-- zapytanie 3 z serwera - nie zostanie wykonane przez klienta
update tabela SET
   pole = 5
where id = 1

Ale można się przed tym łatwo zabezpieczyć.

0

Jeżeli używasz bazy MySQL - istnieje taka konstrukcja jak REPLACE INTO

Poza tym - jeżeli używasz MySQL - wykorzystaj natywny system replikacji. Jest na prawde rewelacyjnie rozwiązany.

Jeżeli potrzebujesz więcej informacji (temat jest obszerny) - zapraszam na GG: 196 48 72 - pisałem kiedyś pracę (zdaje się magisterską) na temat systemu replikacji w MySQL z wykorzystaniem jej w konkretnej produkcyjnej aplikacji.

1 użytkowników online, w tym zalogowanych: 0, gości: 1