Где ORM обманывает ожидания: сессия, ленивые связи, каскады, неявные транзакции
ORM удобен ровно до момента, когда его модель поведения расходится с ожиданиями. Четыре типичных расхождения. Кэш сессии: повторное чтение той же сущности возвращает объект из памяти, а не из базы, поэтому изменение, сделанное другим процессом, не видно до сброса сессии. Отложенная запись: изменения полей не уходят в базу немедленно, а накапливаются и записываются при сбросе — отсюда «неожиданный» порядок операций и внезапные нарушения ограничений в конце транзакции. Каскады: каскад в ORM и ON DELETE CASCADE в схеме — разные механизмы; первый может выполняться построчно и медленно, второй мгновенно и на стороне базы, а настроены они бывают по-разному. Неявные транзакции: часть ORM открывает транзакцию сама, и код, который «просто читает», удерживает соединение и снимок. Плюс отдельная ловушка — обращение к ленивой связи после закрытия сессии, дающее ошибку в сериализации ответа, а не в месте, где написан код.