Heim >Datenbank >MySQL-Tutorial >Wartezeit für MySQL-Transaktionssperre überschritten. Was ist zu tun?
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 aufgetretenMySQL-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### SQL:-----Das Folgende sind die SQL-Anweisung und Stack-Informationen------ -
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.
Ursachenanalyse
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
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.
TransactionDeadLockDetectionTimeOut=10000 (auf 10 Sekunden eingestellt) im Bereich [ndbd default] Der Standardwert ist 1200 (1,2 Sekunden)
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!