2015-08-19 16 views
20

So che c'è un problema in mysql con selezione e inserimento simultanei. Tuttavia, la mia domanda è se apro due connessioni con mysql e continui a caricare i dati usando entrambe, mysql prende i dati contemporaneamente o aspetta che uno finisca prima di caricarne un altro?Inserimento simultaneo con MySQL

Aggiornamento

mi piacerebbe sapere come si comporta mysql in entrambi i casi, come quando sto cercando di caricare i dati nella stessa tabella o tabelle diverse contemporaneamente (apertura connessioni separate).

+1

Questa domanda è troppo ampia. Puoi pubblicare del codice e chiedere punti specifici nel codice? – danihp

risposta

16

Se si creerà una totalmente nuova connessione al database ed eseguire gli inserti sia sul collegamento, dal punto di vista del database sarà ancora essere sequenziale. La documentazione di Concurrent Inserts sulla pagina di documentazione del MySQL dice:

Se ci sono più istruzioni INSERT, vengono messi in coda e eseguite in sequenza, in concomitanza con le istruzioni SELECT.

mente che non v'è alcun controllo sull'ordine in cui due inserti simultanei avrà luogo. L'ordine in questa concorrenza è in balia di molti fattori diversi. Per garantire l'ordine, per impostazione predefinita dovrai sacrificare la concorrenza.

+0

e allora se è lo stesso database ma tabelle diverse? –

+0

@ user3360140: in tal caso le connessioni non saranno in competizione per bloccare la tabella. Pertanto entrambi otterranno il blocco e saranno in grado di inserire entrambi i tavoli contemporaneamente. – displayName

+1

fantastico. Molte grazie! –

7

ti chiedono di rilevamento deadlock, ACID e particolarmente MVCC, blocco e transazioni:

Deadlock Detection e rollback

InnoDB rileva automaticamente deadlock di transazione e rollback di una transazione o transazioni di rompere lo stallo. InnoDB tenta di di selezionare piccole transazioni per il rollback, in cui la dimensione di una transazione è determinata dal numero di righe inserite, aggiornate o eliminate. Quando InnoDB esegue un rollback completo di una transazione, vengono rilasciati tutti i blocchi impostati dalla transazione. Tuttavia, se si verifica il rollback di una singola istruzione SQL in seguito a un errore, alcuni dei blocchi impostati dall'istruzione potrebbero essere conservati. Ciò accade perché InnoDB memorizza blocchi di riga in un formato tale che non può sapere in seguito quale blocco è stato impostato da quale istruzione.

https://dev.mysql.com/doc/refman/5.6/en/innodb-deadlock-detection.html

bloccaggio

Il sistema di protezione un'operazione di vedere o modificare dati che viene interrogati o modificati da altre transazioni. La strategia di blocco deve bilanciare l'affidabilità e la coerenza delle operazioni del database (i principi della filosofia ACID) rispetto alle prestazioni necessarie per una buona concorrenza. La messa a punto della strategia di blocco implica spesso la scelta di un livello di isolamento e la garanzia che tutte le operazioni del database sono sicure e affidabili per il livello di isolamento .

http://dev.mysql.com/doc/refman/5.5/en/glossary.html#glos_locking

ACIDO

Un acronimo di atomicità, consistenza, isolamento e durevolezza. Queste proprietà sono tutte desiderabili in un sistema di database, e sono tutte strettamente legate alla nozione di transazione. Le funzionalità di transazione didi InnoDB aderiscono ai principi ACID. Le transazioni sono unità di lavoro atomiche che possono essere inoltrate o rotolate indietro.Quando una transazione effettua più modifiche al database, , tutte o tutte le modifiche vengono eseguite al momento della transazione, oppure tutte le modifiche vengono annullate al momento del rollback della transazione. Il database rimane sempre in uno stato coerente, dopo ogni commit o rollback e mentre le transazioni sono in corso. Se i dati relativi sono aggiornati su più tabelle, le query visualizzano tutti i vecchi valori o tutti i nuovi valori, non un insieme di valori vecchi e nuovi. Le transazioni sono protette (isolate) l'una dall'altra mentre sono in corso ; non possono interferire tra loro o vedere reciprocamente i dati non salvati. Questo isolamento è ottenuto attraverso il meccanismo di bloccaggio . Gli utenti esperti possono regolare il livello di isolamento, scambiando meno protezione a favore di un aumento delle prestazioni e della concorrenza, quando possono essere sicuri che le transazioni non interferiscano realmente tra .

http://dev.mysql.com/doc/refman/5.5/en/glossary.html#glos_acid

MVCC

InnoDB è un controllo multiversion concorrenza (MVCC) motore di archiviazione quale possono esistere molte versioni della singola fila allo stesso tempo . In realtà ci può essere un'enorme quantità di tali versioni di riga. A seconda della modalità di isolamento che hai scelto, InnoDB potrebbe dover mantenere tutte le versioni di riga tornando alla visualizzazione di lettura più recente attiva, ma almeno dovrà mantenere tutte le versioni che tornano all'avvio di SELECT che è attualmente in esecuzione

https://www.percona.com/blog/2014/12/17/innodbs-multi-versioning-handling-can-be-achilles-heel/

3

Dipende.

Dipende dal client: alcuni client consentono l'accesso simultaneo; alcuni serializzeranno l'accesso, perdendo così il guadagno previsto. Non hai nemmeno specificato PHP vs Java vs ... o Apache vs ... o Windows vs ... Molte combinazioni semplicemente non forniscono alcun parallelismo.

Se tabelle diverse, esiste solo una contesa generale per I/O, CPU, Mutex sul buffer_pool, ecc. È possibile un ragionevole parallelismo.

Se stessa tabella, dipende dagli indici e dai modelli di accesso.In alcuni casi i thread si bloccano a vicenda. In alcuni casi anche "deadlock" e rollback di una delle transazioni. I deadlock non solo rallentano, ma ti fanno riprovare gli inserti.

Se si cerca l'ingestione ad alta velocità di molte righe, vedere my blog. Descrive le tecniche e indica sever delle ramificazioni, come la replica, la scelta del motore, il multi-threading.

Più thread che si inseriscono nelle stesse tabelle: dipende molto dai valori forniti per le chiavi PRIMARY o UNIQUE. Dipende se altre azioni sono prese nella stessa transazione. Dipende da quanto I/O è coinvolto. Dipende dal fatto che tu stia eseguendo inserti a riga singola o batch. Dipende da ... (Mi spiace essere vago, ma la tua domanda non è molto specifica.)

Se vuoi presentare le specifiche su due o tre disegni, possiamo discutere le specifiche.

5

MySQL supporta l'inserimento parallelo nella stessa tabella.

Gli approcci per lettura/scrittura simultanea dipendono dal motore di archiviazione utilizzato.

InnoDB

MySQL utilizza il blocco a livello di riga per le tabelle InnoDB per supportare l'accesso in scrittura simultanea da più sessioni, rendendoli adatti multiutente, altamente concorrenti e applicazioni OLTP.

MyISAM

MySQL utilizza il blocco a livello di tabella per MyISAM, MEMORY, MERGE tabelle, permettendo solo una sessione per aggiornare quei tavoli alla volta, rendendoli più adatti per la sola lettura, lettura prevalentemente o applicazioni per utente singolo

Tuttavia, il comportamento sopra riportato delle tabelle MyISAM può essere modificato dalla variabile di sistema concurrent_insert per ottenere la scrittura simultanea. Si prega di riferire link per i dettagli.

Quindi, di fatto, MySQL supporta l'inserimento simultaneo per il motore di archiviazione InnoDB e MyISAM.

Problemi correlati