2012-09-03 5 views
7

In alcune occasioni, quando molti processi back-end capita di imbattersi nello stesso momento (gestione della coda è un'altra cosa, io posso risolverlo così, ma questo non è il problema qui), ottengo General error: 1205 Lock wait timeout exceeded; try restarting transaction ROLLING BACKCome dare priorità a determinate domande?

Il processo che ha meno priorità è quello che blocca la tabella, poiché è stato avviato alcuni minuti prima di quello ad alta priorità.

Come si dà priorità a una query su un processo già in esecuzione?

Spero che sia stato abbastanza chiaro.

risposta

12

Una volta che una query ha iniziato l'esecuzione, non può essere sospesa/interrotta. L'unica eccezione a questo è il livello di amministrazione del database in cui è possibile forzare la query a fermarsi (pensate ad esso come uccidere un processo in esecuzione in Windows, se volete). Comunque tu non vuoi farlo, quindi dimenticalo.

L'opzione migliore sarebbe utilizzare un'operazione BASSA PRIORITÀ BASSA. Fondamentalmente ciò significa che se la query sulla BASSA PRIORITÀ impiega troppo tempo per essere eseguita, pensa ai modi in cui potresti dividerlo per essere più veloce senza creare dati orfani o dati illegali nel database.

Un caso di utilizzo molto semplice sarebbe immaginare un inserto che inserisca 10.000 nuove righe. "Chunking" dell'inserto in modo che esegua l'inserto più volte con insiemi di dati più piccoli (ad esempio 500 alla volta), ognuno si completerà più rapidamente e quindi consentirà l'esecuzione di qualsiasi operazione PRIORITÀ non BASSA in modo più tempestivo .

Come

Impostazione qualcosa di bassa priorità è semplice come l'aggiunta nella bandiera LOW_PRIORITY.

INSERT LOW_PRIORITY INTO xxx(a,b,c,) VALUES()

UPDATE LOW_PRIORITY xxx SET a=b

DELETE LOW_PRIORITY FROM xxx WHERE a="value"

+0

ok ... come vorrei segnare una query a bassa priorità (u può aggiungere questo alla risposta?) –

+1

aggiunto, non lo si dimentichi sarà inoltre necessario Tagliare l'operazione in bit più piccoli affinché funzioni, una volta avviata la query, deve terminare per consentire l'esecuzione di altre operazioni. LOW PRIORITY consentirà semplicemente l'esecuzione di altre query normali/ad alta priorità non appena termina la query LOW PRIORITY e prima della successiva PRIORITÀ BASSA (ovvero la seconda della query Chunked). – Lee

+1

@Lee L'unica cosa che aggiungerei è l'informazione sull'opzione 'low_priority_updates' http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_low_priority_updates –