Какие важные, но редкие проблемы могут возникать в базах данных
Python
Middle
Без компании
Какие важные, но редкие проблемы могут возникать в базах данных
Ответы
- **Deadlocks** – когда две транзакции блокируют друг друга, ожидая освобождения ресурсов.
```
# Пример deadlock в SQLAlchemy
session1.execute("UPDATE table1 SET col=1 WHERE id=1") # Блокирует строку 1
session2.execute("UPDATE table2 SET col=2 WHERE id=1") # Блокирует строку 2
session1.execute("UPDATE table2 SET col=1 WHERE id=1") # Ждёт session2
session2.execute("UPDATE table1 SET col=2 WHERE id=1") # Ждёт session1
```
**Решение:** Таймауты, порядок блокировок.
- **N+1 Query Problem** – когда ORM делает множество запросов вместо JOIN.
```
# Плохо (N запросов)
for user in session.query(User):
print(user.posts) # Запрос для каждого пользователя
```
**Решение:** `.join()` или `.options(joinedload(...))`.
- **Проблемы с индексами** – например, неиспользуемые или "раздутые" индексы.
**Решение:** Анализ `EXPLAIN` и регулярное обслуживание (`REINDEX`).
- **Транзакции-долгожители** – блокируют ресурсы и могут привести к деградации.
**Решение:** Лимиты времени, разделение на мелкие транзакции.
- **Потерянные обновления** – если два клиента читают, изменяют и записывают данные без блокировок.
**Решение:** `SELECT FOR UPDATE` или оптимистичные блокировки (версионирование).
- **Проблемы с кодировкой** – например, некорректное хранение UTF-8.
**Решение:** Проверять настройки БД (`SHOW SERVER_ENCODING` в PostgreSQL).
- **Утечки соединений** – незакрытые соединения исчерпывают пул.
```
# Плохо
conn = pool.getconn()
# Забыли conn.close()
```
**Решение:** Контекстные менеджеры (`with`) или `try/finally`.