Какие важные, но редкие проблемы могут возникать в базах данных

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`.