Ho una tabella MySQL con circa 5.000.000 di file che vengono costantemente aggiornate in piccoli modi da processi Perl paralleli che si connettono tramite DBI. La tabella ha circa 10 colonne e diversi indici.Errore MySQL "Quando si cerca di ottenere il blocco, prova a riavviare la transazione"
Un'operazione piuttosto comune dà luogo alla seguente errore a volte:
DBD::mysql::st execute failed: Deadlock found when trying to get lock; try restarting transaction at Db.pm line 276.
L'istruzione SQL che fa scattare l'errore è qualcosa di simile:
UPDATE file_table SET a_lock = 'process-1234' WHERE param1 = 'X' AND param2 = 'Y' AND param3 = 'Z' LIMIT 47
L'errore si attiva solo a volte. Stimo nell'1% delle chiamate o meno. Tuttavia, non è mai successo con un piccolo tavolo ed è diventato più comune man mano che il database è cresciuto.
Si noti che sto utilizzando il campo a_lock in file_table per garantire che i quattro processi quasi identici in esecuzione non provino e lavorino sulla stessa riga. Il limite è progettato per rompere il loro lavoro in piccoli pezzi.
Non ho eseguito molta ottimizzazione su MySQL o DBD :: mysql. MySQL è una distribuzione standard di Solaris, e la connessione al database è impostato come segue:
my $dsn = "DBI:mysql:database=" . $DbConfig::database . ";host=${DbConfig::hostname};port=${DbConfig::port}";
my $dbh = DBI->connect($dsn, $DbConfig::username, $DbConfig::password, { RaiseError => 1, AutoCommit => 1 }) or die $DBI::errstr;
Ho visto online che molte altre persone hanno segnalato errori simili e che questo può essere una situazione di vera e propria situazione di stallo.
Ho due domande:
Che cosa circa la mia situazione sta causando l'errore di cui sopra?
C'è un modo semplice per aggirare o ridurre la sua frequenza? Ad esempio, come faccio esattamente a "riavviare la transazione alla riga Db.pm 276"?
Grazie in anticipo.
Quali sono i codici di errore che dobbiamo catturare? Basta prendere 1205 da solo? Ci sono oltre 900 codici di errore in http://dev.mysql.com/doc/refman/5.7/en/error-messages-server.html. Come fai a sapere tutti i codici che dobbiamo prendere per implementare una soluzione adeguata per il tuo suggerimento di prova/presa? – Pacerier
Questo significa che oltre a "InnoDB o qualsiasi RDBMS transazionale a livello di riga" non hanno questi problemi? –