Heim >Datenbank >MySQL-Tutorial >Wartezeit für MySQL-Transaktionssperre überschritten. Was ist zu tun?

Wartezeit für MySQL-Transaktionssperre überschritten. Was ist zu tun?

PHPz
PHPznach vorne
2023-06-03 11:32:473049Durchsuche

Problemszenario

Umgebung, in der das Problem auftritt:
1. Die gleichen Daten werden nacheinander innerhalb derselben Transaktion eingefügt.
3. Es kommt zu einer hohen Parallelität Ausnahme wurde ausgelöst, Ausnahmeinformationen:

org.springframework.dao.CannotAcquireLockException:

### Fehler beim Aktualisieren der Datenbank: java.sql.SQLException: Wartezeit für Sperre überschritten; versuchen Sie, die Transaktion neu zu starten com.*.dao.mapper.PhoneFlowMapper.updateByPrimaryKeySelective-Inline
### Der Fehler ist beim Festlegen der Parameter aufgetreten

### SQL:-----Das Folgende sind die SQL-Anweisung und Stack-Informationen------ -


Ursachenanalyse

Bei hoher Parallelität führen Spring-Transaktionen zu Datenbank-Deadlocks, bei nachfolgenden Vorgängen kommt es zu Zeitüberschreitungen und es kommt zu Ausnahmen.
MySQL-Datenbank übernimmt den InnoDB-Modus. Der Standardparameter: innodb_lock_wait_timeout legt die Sperrwartezeit auf 50 Sekunden fest. Sobald die Datenbanksperre diese Zeit überschreitet, wird ein Fehler gemeldet.

Lösung


1. Verwenden Sie die folgende Anweisung, um die Daten für die übermittelte Transaktion zu finden und diesen Thread zu beenden.

select * from information_schema.innodb_trx

2. Erhöhen Sie die Sperrwartezeit, also den Parameterwert des folgenden Konfigurationselements, in Sekunden (s)

innodb_lock_wait_timeout=500

3. Optimieren Sie den gespeicherten Prozess und vermeiden Sie langes Warten auf Transaktionen.

Referenzinformationen

1. Sperrwartezeitüberschreitung. Dies wird dadurch verursacht, dass die aktuelle Transaktion darauf wartet, dass andere Transaktionen Sperrressourcen freigeben. Sie können Tabellen und Anweisungen finden, die um Sperrressourcen konkurrieren, SQL optimieren, Indizes erstellen usw. Wenn das immer noch nicht funktioniert, können Sie die Anzahl gleichzeitiger Threads entsprechend reduzieren.

2. Die Transaktion läuft ab, während auf die Sperrung einer bestimmten Tabelle gewartet wird. Es wird geschätzt, dass die Tabelle von einem anderen Prozess gesperrt wird und nicht freigegeben wurde.

Sie können SHOW INNODB STATUS/G verwenden, um den Sperrstatus zu überprüfen.

3. Suchen Sie nach einer Lösung und fügen Sie Folgendes hinzu:

TransactionDeadLockDetectionTimeOut=10000 (auf 10 Sekunden eingestellt) im Bereich [ndbd default] Der Standardwert ist 1200 (1,2 Sekunden)

4 Erkennen Sie Deadlocks und reagieren Sie, oder beenden Sie die Deadlock-Situation.


InnoDB erkennt automatisch Transaktions-Deadlocks und setzt eine oder mehrere Transaktionen zurück, um den Deadlock zu überwinden. InnoDB versucht, kleine Transaktionen zum Zurücksetzen auszuwählen, wobei die Größe einer Transaktion durch die Anzahl der eingefügten, aktualisierten oder gelöschten Zeilen bestimmt wird.

Wenn die Parameter innodb_table_locks=1 und autocommit=0 sind, achtet InnoDB auf Tabellen-Deadlocks und Sperren auf Zeilenebene auf MySQL-Ebene. Darüber hinaus erkennt InnoDB keine MySQL Lock Tables-Befehle und andere Deadlocks der Speicher-Engine. Sie sollten innodb_lock_wait_timeout festlegen, um diese Situation zu lösen.

innodb_lock_wait_timeout ist das Timeout für Innodb, um Sperren auf Zeilenebene aufzugeben.

Das obige ist der detaillierte Inhalt vonWartezeit für MySQL-Transaktionssperre überschritten. Was ist zu tun?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen