2012-11-01 13 views
8

Ho ereditato un sistema costruito su un database MySQL utilizzando le tabelle InnoDB. Il sistema ha un bug che si presenta sotto carico pesante. Ho creato alcuni test jmeter per caricare il sistema sperando di vedere il bug in un ambiente controllato. Tuttavia, non sto stressando il sistema correttamente e il bug non viene mai mostrato. La teoria corrente è che le tabelle fortemente bloccate stanno causando un rollback, lasciando i dati dell'utente in uno stato dispari. Questo probabilmente significa che le transazioni non sono strutturate correttamente e voglio trovarle e correggerle, ma prima devo trovare il problema.Simula problemi di blocco tabella

Suppongo che se riesco a creare diversi "carichi bloccanti tabella" controllati nel database posso quindi eseguire i miei utenti simulati sull'intero sistema e forzare il bug a verificarsi o dimostrare la teoria sbagliata, ma non sono sicuro come creare una cosa del genere. Qualcuno ha un'idea del modo migliore per farlo? A questo punto non sono nemmeno sicuro di come sarebbe una povera prima versione, quindi qualsiasi idea per iniziare mi aiuterebbe. Grazie!

+0

Finora, ho creato un "test" jmeter che esegue un SELECT ... FOR UPDATE e quindi aggiorna la riga di interesse nella tabella dei sospetti. Non sono stato in grado di riprodurre il bug fino ad ora, ma questo è l'unico approccio che sono stato in grado di fornire che sembra plausibile. –

risposta

5

Se si sta cercando specificamente uno stato bloccato per una riga in una tabella (presumo che questo sia ciò che si intende a meno che non si stiano eseguendo al volo le modifiche al tavolo stesso). È possibile implementare questo facendo in modo che un secondo script avvii una transazione su un set di righe e quindi si interrompa per un certo periodo di tempo prima di eseguire il rollback o di eseguire il commit della transazione.

Diciamo che avere questa struttura della tabella, ad esempio:

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

aprire un prompt di MySQL e iniziare una transazione:

BEGIN; 

UPDATE allkindsofvalues SET irrelevant_value3 = '32143234232'; 

Ora accendiamo la vostra applicazione. A questo punto, qualsiasi tentativo di utilizzare queste righe attenderà il completamento della transazione avviata.

Nel momento in cui COMMIT o ROLLBACK la transazione nel prompt MySQL, le cose dovrebbero continuare normalmente, ma fino a quel punto le righe saranno in uno stato bloccato, non disponibili per l'accesso. Qual è la condizione che stai tentando di replicare.

+0

Grazie, Shane, sembra che potrebbe farlo, ho intenzione di impostare e fare un tentativo. C'è un modo per tenere traccia di ciò che è bloccato e a che ora è bloccato? Ho registrato le query nella speranza di scoprire il mio bug, ma non sembra che siano sufficienti informazioni per isolare il problema, e ci sono molte domande. –

+0

Funziona molto bene e sembra un ottimo modo per trovare un codice fragile, quindi ho accettato la risposta. Ho intenzione di approfondire questo aspetto e vedere se non riesco a creare alcuni test del jmeter che simulino qualcosa di più vicino a una situazione del mondo reale in cui il blocco si verifica spesso ma non costantemente. Grazie! –