![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 872 Pomógł: 94 Dołączył: 31.03.2010 Ostrzeżenie: (0%) ![]() ![]() |
Dzień dobry, od jakiegoś czasu próbuję poradzić sobie z następującym problemem.
W jednej chwili działa kilka instancji tego samego skryptu, który wysyła rekordy do innej aplikacji przez jej API. Jeden rekord może być wysłany tylko 1 raz, więc zrobiłem to tak:
W tym momencie wszystkie zapytania do tabela1 czekają, aż będzie wykonany update na zablokowanym rekordzie W tym miejscu wykonuję UPDATE:
Teraz wszystkie zapytania z innych instancji skryptu, które mają pobrać wiersze z tej tabeli mogą dalej pracować i nie pobiorą już zablokowanego wiersza, tylko następny. W ten sposób pozbyłem się wysyłania tego samego rekordu kilka razy. Oczywiście SELECT i UPDATE są wykonywane w transakcji, inaczej się nie da dla FOR UPDATE. Niestety takie rozwiązanie ma 2 wady: 1. Jest wolne, ponieważ zapytania do tabela1 czekają na zwolnienie blokady wiersza 2. Jeżeli podczas daleszego przetwarzania rekordy coś się wywali, to rekord jest zablokowany na zawsze i już nie zostanie wysłany. Najlepszym rozwiązaniem dla mnie było by sprawienie, aby pobrany w danej transakcji rekord nie był po prostu widoczny dla innych transakcji do czasu, aż obsługiwana transakcja się zakończy, przy czym nie blokował innych transakcji. Bardzo proszę o podsunięcie jakiegoś lepszego rozwiązania. Ten post edytował lukaskolista 29.07.2015, 09:48:09 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 19.08.2025 - 14:31 |