2012-11-01 10 views
8

Odziedziczyłem system zbudowany na bazie danych MySQL przy użyciu tabel InnoDB. System ma błąd, który pojawia się przy dużym obciążeniu. Stworzyłem kilka testów jmeter, aby załadować system z nadzieją, że zobaczę błąd w kontrolowanym środowisku. Jednak nie podkreślam poprawnie systemu, a błąd nigdy się nie wyświetla. Obecna teoria głosi, że mocno zablokowane tabele powodują wycofanie zmian, pozostawiając dane użytkownika w nieparzystym stanie. Prawdopodobnie oznacza to, że transakcje nie mają poprawnej struktury i chcę je znaleźć i naprawić, ale najpierw muszę znaleźć problem.Symulacja problemów z blokowaniem tabeli

Przypuszczam, że jeśli mogę utworzyć różne kontrolowane "obciążenia blokujące tabelę" w bazie danych, mogę następnie uruchomić symulowanych użytkowników w całym systemie i zmusić błąd do wystąpienia lub udowodnić, że teoria jest zła, ale nie jestem pewien jak stworzyć coś takiego. Czy ktoś ma pomysł, jak najlepiej to zrobić? W tym momencie nie jestem nawet pewien, jak wyglądałaby zła pierwsza wersja, więc pomogłyby mi wszelkie pomysły na rozpoczęcie pracy. Dzięki!

+0

Do tej pory stworzyłem jmeter "test", który wykonuje polecenie SELECT ... FOR UPDATE, a następnie aktualizuje wiersz zainteresowania w podejrzanej tabeli. Do tej pory nie udało mi się odtworzyć błędu, ale to jedyne podejście, jakie udało mi się wymyślić, które wydaje się wiarygodne. –

Odpowiedz

5

Jeśli szczególnie poszukujesz zablokowanego stanu dla wiersza w tabeli (zakładam, że to masz na myśli, chyba że dokonujesz zmian w samej tabeli w locie). Możesz to zaimplementować, wprowadzając drugi skrypt do zainicjowania transakcji na zbiorze wierszy, a następnie wstrzymaj na jakiś czas przed wycofaniem lub zatwierdzeniem transakcji.

Powiedzmy, że masz tę strukturę tabeli dla przykładu:

CREATE TABLE `allkindsofvalues` (
    `value1` int(11) NOT NULL, 
    `value2` int(11) NOT NULL, 
    `irrelevant_value3` int(11) NOT NULL, 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

otworzyć wiersz MySQL i zainicjowania transakcji:

BEGIN; 

UPDATE allkindsofvalues SET irrelevant_value3 = '32143234232'; 

Teraz uruchomi aplikację. W tym momencie wszelkie próby użycia tych wierszy będą czekać na zakończenie zainicjowanej transakcji.

W momencie, gdy COMMIT lub ROLLBACK transakcji w Monit MySQL, rzeczy powinny kontynuować normalnie, ale do tego momentu wiersze będą w stanie zablokowanym, niedostępne dla dostępu. Wygląda na to, że próbujesz replikować.

+0

Dzięki, Shane, to brzmi jak może to zrobić, przygotuję to i spróbuję. Czy istnieje sposób śledzenia, co jest zablokowane i która godzina jest zablokowana? Zalogowałem się z zapytaniami mając nadzieję na wykrycie mojego błędu, ale to nie wydaje się wystarczającą informacją, aby wyizolować problem i jest mnóstwo zapytań. –

+0

To działa bardzo dobrze i wydaje się świetnym sposobem na znalezienie łamliwego kodu, więc przyjąłem odpowiedź. Zamierzam rozwinąć tę kwestię i zobaczyć, czy nie mogę utworzyć testów jmetowych, które symulują coś bliższego rzeczywistej sytuacji, w której blokowanie występuje często, ale nie stale. Dzięki! –