✦ Oplossingen · Database (MySQL/MariaDB)

MySQL: Lock wait timeout exceeded; try restarting transaction

'ERROR 1205: Lock wait timeout exceeded; try restarting transaction' betekent dat een query te lang wachtte op een rij die een andere transactie vergrendeld hield. Zo vind je de blokkeerder.

Waarom gebeurt dit?

InnoDB vergrendelt rijen die in een transactie worden gewijzigd. Wil een tweede transactie dezelfde rij aanpassen, dan wacht die. Duurt dat langer dan innodb_lock_wait_timeout (standaard 50 seconden), dan geeft de server fout 1205 en wordt de wachtende opdracht afgebroken.

De echte oorzaak is de transactie die het slot vasthoudt: een lange update zonder index, een script dat een transactie start en niet afsluit (geen COMMIT), of een beheerder die in een databaseprogramma een transactie open liet staan.

Zo los je het op, stap voor stap

Menunamen kunnen per versie of toestel iets anders heten. Loop de stappen op volgorde af en stop zodra het werkt.

  1. Zoek de transactie die blokkeert

    InnoDB toont lopende transacties en hoe lang ze al open zijn.

    SELECT trx_id, trx_started, trx_state, trx_mysql_thread_id, trx_query
    FROM information_schema.innodb_trx
    ORDER BY trx_started;
  2. Bekijk de details van de locks

    SHOW ENGINE INNODB STATUS laat in de sectie TRANSACTIONS zien wie op wie wacht.

    SHOW ENGINE INNODB STATUS\G
  3. Beëindig een vastgelopen transactie

    Is een transactie duidelijk vergeten (lang open, niets meer aan het doen), beëindig dan die verbinding. Zijn wijzigingen worden teruggedraaid.

    KILL 12345;  -- trx_mysql_thread_id uit de eerste query
  4. Maak transacties kort

    Doe in een transactie alleen wat bij elkaar hoort, en sluit hem direct af. Geen externe API-aanroepen of wachten op de gebruiker binnen een transactie.

  5. Zorg voor indexen op de WHERE-kolommen

    Zonder index vergrendelt een UPDATE of DELETE veel meer rijen dan nodig, omdat InnoDB moet zoeken. Een index op de kolom in de WHERE beperkt de locks.

    ALTER TABLE bestellingen ADD INDEX idx_status (status);

Lukt het niet? Wij helpen

Kom je er met deze stappen niet uit, of wil je het liever niet zelf doen? We kijken online mee of komen langs. Hulp op afstand kost €20 per uur; komen we langs, dan is de prijs op aanvraag. Je weet vooraf waar je aan toe bent.

Aanvraag

Hulp aanvragen

Schrijf kort wat er misgaat en wat je al hebt geprobeerd. Kies of we bellen, online meekijken of langskomen.

Veelgestelde vragen

Vragen over dit probleem

Moet ik innodb_lock_wait_timeout verhogen?

Zelden. Langer wachten laat gebruikers alleen langer wachten. Los de transactie op die het slot vasthoudt.

Wat is het verschil met een deadlock?

Bij een lock wait wacht de ene transactie op de andere. Bij een deadlock wachten ze op elkaar; MySQL ziet dat direct en breekt er één af. Zie deadlock found.

Mijn applicatie moet de opdracht opnieuw proberen?

Dat is wat de melding voorstelt: 'try restarting transaction'. Bouw een beperkte herhaling in, maar los ook de oorzaak op.