Я разрабатываю мобильное приложение, чей бэкэнд разработан в Java, а база данных - MySQL.Ошибка блокировки ожидания блокировки MySQL и ошибки тупика
У нас есть некоторые операции вставки и обновления в таблицах базы данных с большим количеством строк (между 400 000 и 3.000.000). Каждой операции обычно не нужно касаться каждого регистра таблицы, но, возможно, они вызываются одновременно, чтобы обновить 20% из них.
Иногда я получаю эту ошибку:
Deadlock found when trying to get lock; try restarting transaction
и
Lock wait timeout exceeded; try restarting transaction
Я улучшил свои запросы делая их меньше и быстрее, но у меня есть еще большая проблема, когда некоторые операции могут не выполняться.
Мои решения до сих пор были: производительность сервера
- Увеличение (AWS Instance от m2.large до c3.2xlarge)
SET GLOBAL tx_isolation = 'READ-COMMITTED';
- Избегайте проверять внешние ключи:
SET FOREIGN_KEY_CHECKS = 0;
(я знаю это небезопасно, но я не хочу блокировать базу данных) - Установите эти значения для переменных времени ожидания (
SHOW VARIABLES LIKE '%timeout%';
):connect_timeout
: 10delayed_insert_timeout
: 300innodb_lock_wait_timeout
: 50innodb_rollback_on_timeout
: ВЫКЛinteractive_timeout
: 28800lock_wait_timeout
: 31536000net_read_timeout
: 30net_write_timeout
: 60slave_net_timeout
: 3600wait_timeout
: 28800
Но я не уверен, что если эти вещи снижение производительности.
Любая идея о том, как уменьшить эти ошибки?
Примечание: эти другие SO ответить мне не помогают:
MySQL Lock wait timeout exceeded
MySQL: "lock wait timeout exceeded"
How can I change the default Mysql connection timeout when connecting through python?
какой двигатель базы данных вы используете? –
Как вы подключаетесь к базе данных? Какой драйвер вы используете? Используете ли вы пул соединений? – Eduard
Я использую InnoDB, и я использую JPA for persistance. –