Что такое ошибка Deadlock?

Ошибка Deadlock возникает, когда две или более транзакции ожидают освобождения ресурсов, заблокированных друг другом.

Причины возникновения

  • Неправильный порядок блокировок
  • Длинные транзакции
  • Отсутствие индексов
  • Высокая конкурентность
  • Неправильная изоляция транзакций

Как отладить ошибку

  1. Проверь логи deadlock - ищи информацию о заблокированных транзакциях
  2. Анализируй запросы - ищи медленные или проблемные запросы
  3. Проверь индексы - убедись в наличии нужных индексов
  4. Мониторь активные транзакции - отслеживай длинные транзакции

Как исправить ошибку

1. Оптимизируй порядок блокировок

1-- Всегда блокируй таблицы в одинаковом порядке
2BEGIN TRANSACTION;
3
4-- Правильный порядок
5UPDATE table_a SET column = value WHERE id = 1;
6UPDATE table_b SET column = value WHERE id = 1;
7
8COMMIT;

2. Уменьши время транзакций

1-- Разбивай большие транзакции на маленькие
2BEGIN TRANSACTION;
3UPDATE users SET last_login = NOW() WHERE id = 1;
4COMMIT;
5
6BEGIN TRANSACTION;
7UPDATE user_stats SET login_count = login_count + 1 WHERE user_id = 1;
8COMMIT;

3. Добавь нужные индексы

1-- Создай индексы для часто используемых условий WHERE
2CREATE INDEX idx_user_email ON users(email);
3CREATE INDEX idx_order_user_id ON orders(user_id);
4
5-- Составные индексы
6CREATE INDEX idx_user_status_created ON users(status, created_at);

4. Используй правильный уровень изоляции

1-- Для PostgreSQL
2SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
3
4-- Для MySQL
5SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
6
7-- Для SQL Server
8SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

Как мониторить подобные ошибки

  • Включи логирование deadlock
  • Мониторь активные транзакции
  • Настрой алерты на deadlock
  • Анализируй медленные запросы

FAQ

В: Как определить причину deadlock?

О: Используй логи deadlock, которые показывают какие транзакции и ресурсы участвуют в блокировке.

В: Что делать с частыми deadlock?

О: Оптимизируй запросы, добавь индексы, уменьши время транзакций и используй retry логику.

В: Как предотвратить deadlock?

О: Используй одинаковый порядок блокировок, уменьшай время транзакций и оптимизируй запросы.

Лучшие практики

  • Всегда используй одинаковый порядок блокировок
  • Уменьшай время транзакций
  • Добавляй нужные индексы
  • Используй правильный уровень изоляции
  • Мониторь и анализируй deadlock