Tutti coloro che utilizzano le tabelle InnoDB probabilmente ottenuto utilizzare al fatto InnoDB tabelle eseguono senza blocco legge, il che significa a meno che non si utilizzano alcuni modificatori come ad esempio BLOCCO IN MODALITA 'azione o per aggiornamento, selezionare le dichiarazioni non bloccano alcuna riga durante l'esecuzione.
Questo è generalmente corretto, tuttavia c'è un'eccezione notevole - INSERIRE nella tabella1 SELEZIONA * DA tabella2. Questa istruzione eseguirà la lettura di blocco (blocchi condivisi) per la tabella table2. Si applica anche alle tabelle simili con clausola where e join. È importante che le tabelle che vengono letti siano Innodb, anche se le scritture vengono eseguite nella tabella MyISAM.
Allora perché è stato questo fatto, essendo piuttosto male per MySQL prestazioni e concorrenza?
Il motivo è: la replica. In MySQL prima della 5.1 la replica è basata sull'istruzione, il che significa che le istruzioni replicate sul master dovrebbero avere lo stesso effetto dello slave. Se Innodb non bloccherebbe le righe nella tabella di origine, un'altra transazione potrebbe modificare la riga e il commit prima della transazione che sta eseguendo INSERT .. Istruzione SELECT. Questo farebbe sì che questa transazione venga applicata sullo slave prima dell'istruzione INSERT ... SELECT e possibilmente produca dati diversi da quelli master. Il blocco delle righe nella tabella di origine durante la lettura protegge da questo effetto mentre le altre transazioni modificano le righe prima che INSERT ... SELECT abbia la possibilità di accedervi, inoltre verrà modificato nello stesso ordine sullo slave. Se la transazione tenta di modificare la riga dopo che è stata acceduta e quindi bloccata da INSERT ... SELECT, la transazione dovrà attendere il completamento dell'istruzione per assicurarsi che venga eseguita sullo slave nell'ordine corretto. Diventa abbastanza complicato? Bene, tutto ciò che occorre sapere è che deve essere fatto prima che la replica funzioni correttamente in MySQL prima di 5.1.
In MySQL 5.1 questo e alcuni altri problemi dovrebbero essere risolti dalla replica basata su riga.Tuttavia, devo ancora sottoporlo a test di stress reali per vedere come funziona :)
Un'altra cosa da tenere in considerazione - INSERT ... SELECT esegue in realtà la lettura in modalità di blocco e quindi ignora parzialmente il controllo della versione e recupera l'ultima riga confermata . Quindi, anche se si opera in modalità REPEATABLE-READ, questa operazione verrà eseguita nella modalità READ-COMMITTED , dando potenzialmente un risultato diverso rispetto a quanto sarebbe offerto da SELECT. Questo a proposito si applica a SELECT .. LOCK IN SHARE MODE e SELECT ... FOR UPDATE pure.
Uno chiedo cosa è se non sto utilizzando la replica e il mio registro binario è disabilitato? Se non viene utilizzata la replica, è possibile abilitare l'opzione innodb_locks_unsafe_for_binlog, che allenterà i blocchi che Innodb imposta nell'esecuzione dell'istruzione, che generalmente offre una maggiore concorrenza. Tuttavia, come dice il nome, rende i lock non sicuri prima della replica e del recupero puntuale, quindi usa l'opzione innodb_locks_unsafe_for_binlog con cautela.
La nota che disabilita i registri binari non è sufficiente per attivare i blocchi rilassati. È necessario impostare innodb_locks_unsafe_for_binlog = 1 anche per . Ciò è possibile in modo che l'abilitazione diregistro binario non causi modifiche impreviste nel blocco dei problemi di comportamento e prestazioni . Puoi anche usare questa opzione con la replica a volte, se sai davvero cosa stai facendo. Vorrei raccomandare lo a meno che non sia realmente necessario, dato che potresti non sapere quali altri blocchi saranno rilassati nelle versioni future e in che modo lo influirà sulla tua replica.
Non ho chiesto qui, ma non ho trovato un modo. Sto usando un file di output per impedire i 20 minuti di blocco richiesti dalla mia query :) – therealsix
Qualcuno sa se questo problema è effettivamente risolto in MySQL 5.1 come suggerisce l'articolo? – Artem
No, MySQL 5.1.44 - stesso problema – clops