Próbuję napisać kod bazy danych, aby upewnić się, że nie podlega warunkom wyścigu, aby upewnić się, że zablokowałem prawidłowe wiersze lub tabele. Ale często zastanawiam się: czy mój kod jest poprawny? Czy można zmusić do manifestacji jakiekolwiek istniejące warunki wyścigu? Chcę mieć pewność, że jeśli tak się stanie w środowisku produkcyjnym, moja aplikacja zrobi właściwą rzecz.
Ogólnie wiem dokładnie, które współbieżne zapytanie może powodować problem, ale nie mam pojęcia, jak zmusić je do jednoczesnego uruchomienia, aby sprawdzić, czy zdarzy się prawidłowe zachowanie (np. Użyłem właściwego typu blokady), czy właściwe błędy to wyrzucony itp.
Uwaga: używam PostgreSQL i Perla, więc jeśli nie można na nie udzielić ogólnej odpowiedzi, prawdopodobnie powinien zostać ponownie oznaczony jako taki.
Aktualizacja: Wolałbym, gdyby rozwiązanie było programowe. W ten sposób mogę pisać automatyczne testy, aby upewnić się, że nie ma regresji.
źródło
Odpowiedzi:
Robię to cały czas z moimi modułami T-SQL.
Zasadniczo wszystko, co musisz zrobić, to uruchomić moduły z dwóch lub więcej połączeń w pętli przez kilka minut . Zazwyczaj wszystkie potencjalne problemy są ujawniane w ciągu kilku minut, przy założeniu, że masz SQL Server z przyzwoitymi procesorami.
Napisałem kilka przykładów tu i tutaj .
źródło
Zwykle pracuję z narzędziem wiersza poleceń RDBMS, po prostu uruchomiłem 2 (lub więcej) instancji CLI. Następnie możesz odtwarzać jeden po drugim i jako wyścig (który wyglądałby jak RPG akcji) instrukcje SQL wysyłane przez warstwę aplikacji. Powinieneś eksperymentować / czuć działanie systemów blokujących, ponieważ Twój CLI „zawiesi się” trochę, czekając na zwolnienie blokad z innych CLI.
Jeśli brzmi to jak błoto, nie wahaj się tego powiedzieć ;-)
źródło
Warunki wyścigu wymagają wielu wątków wykonania, dlatego aby przeprowadzić test jednostkowy, musisz mieć możliwość rozpoczęcia jednego lub więcej wątków. W Oracle użyłbym DBMS_Scheduler do uruchomienia procesu symulującego drugiego użytkownika. Jeśli PostgreSQL / Perl ma sposób na programowe zainicjowanie drugiego procesu, powinieneś być w stanie zrobić coś takiego:
Proces 1 Proces 2
Dobrze jest myśleć, jak radzić sobie z warunkami wyścigowymi, a co ważniejsze, jak je testować.
źródło
Dopóki blokujesz rzędy, nie powinieneś być w stanie wyścigowym, ponieważ zwykle dzieje się tak, gdy nie ma blokady.
Ale możesz zostać zakleszczony, jeśli jedno pytanie zbyt długo blokuje twoje pytanie.
Jest to trudne do przetestowania, ponieważ czas zapytań może się zmieniać, gdy baza danych rośnie.
Zapytania, które działają dobrze przy 100 000 wierszy danych testowych, wykraczają poza tabelę przy 10 000 000 wierszy.
Tego rodzaju problem może być bardzo trudny do znalezienia z wyprzedzeniem, ale wiele baz danych ma pewną metodę identyfikowania wolnych zapytań.
Korzystając z tego normalnie, powinieneś być w stanie wychwycić wszelkie zapytania, które mają kłopoty, z dużym ostrzeżeniem.
Jeśli sami sobie zamkniesz, to inna historia, ale nie mogę pomóc.
źródło
select for update