Самоучитель: PHP под капотом: runtime и стандартная библиотека
Глава 15 из 20V. Данные и доверие140 минут

Глава 15. PDO, транзакции и переносимый контракт данных

PDO унифицирует интерфейс, но не семантику СУБД: SQL, типы, isolation и поведение ошибок проверяются на выбранном драйвере.

После главы вы сможете
  • отделять values от SQL
  • задавать транзакционную границу
  • тестировать драйвер

Что действительно унифицирует PDO

PDO даёт общий способ соединения, prepare, execute и fetch, но dialect, типы, DDL и isolation остаются свойствами СУБД. Pulse использует SQLite для локального учебного сценария и отдельный integration profile для production-драйвера. Успех одного не считается доказательством другого.

DSN и options собираются конфигурацией. ERRMODE_EXCEPTION включён явно, fetch mode задан у запроса, а charset является частью соединения, а не надеждой на значение по умолчанию.

Граница атомарности

Запись пакета PulseСобытия и позиция источника меняются вместе; внешний эффект запускается только после успешного commit.BegintransactionInsert batcheventsUpdate cursoroffsetCommitone outcomePublishafter commit
События и позиция источника меняются вместе; внешний эффект запускается только после успешного commit.

Placeholder только для значения

Prepared statement разделяет структуру SQL и значения. Идентификатор таблицы, имя колонки и направление сортировки placeholder не принимают; их выбирают из серверного allowlist. Динамический IN получает отдельный placeholder на каждое значение.

Native prepares предпочтительны там, где драйвер поддерживает нужное поведение. Emulated prepares меняют parsing и типизацию, поэтому настройка фиксируется и покрывается тестом, а не остаётся случайным default.

Типы на входе и выходе

bindValue с явным PDO::PARAM_INT полезен для LIMIT и целых ключей. Но не все типы базы отображаются в PHP одинаково: decimal часто приходит строкой, boolean зависит от драйвера, большие числа требуют осторожности. Mapper проверяет форму строки до объекта.

Не используйте rowCount SELECT как переносимый подсчёт. Выполните COUNT, если он нужен, или проверьте наличие fetch результата по контракту конкретного запроса.

Retry только всей операции

Deadlock или serialization failure иногда допускают повтор всей транзакции с ограниченным backoff. Нельзя повторять только последний INSERT, если предыдущие действия уже изменили состояние. Операция должна быть идемпотентной или иметь ключ дедупликации.

DDL внутри транзакции ведёт себя по-разному. Миграции Pulse отдельно тестируются на целевой СУБД, а application transaction не смешивается с изменением схемы.

Лаборатория

Сохраните batch событий и cursor атомарно. Смоделируйте исключение между действиями, повтор одного batch и попытку передать sort direction как пользовательскую строку.

  • SQL structure выбирается allowlist.
  • Rollback возвращает cursor и события в прежнее состояние.
  • Integration test использует production-драйвер.
Локальный прогресс

Закрепите материал

Отметка, заметка, чек-лист и ответы остаются в localStorage этого браузера и не отправляются в аналитику.

Контрольная карта лаборатории

Выполнено: 0 из 3

Локальный тест

1. Можно ли placeholder использовать для имени колонки?
2. Что повторять после retryable transaction failure?

Перелинковка со справочником

Проверка актуальности

  • php.nethttps://www.php.net/manual/en/book.pdo.phpПервичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.
  • getcomposer.orghttps://getcomposer.org/doc/articles/composer-platform-dependencies.mdПервичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.

Текст и схемы созданы для этого самоучителя без воспроизведения страниц, иллюстраций и листингов приложенной книги. Проверено: .

Данные этого сервиса

Настройки cookie и локальных данных

Аналитика

Текущий статус: не выбран. До согласия обе аналитические системы не загружаются.

Локальные данные

Удаление затрагивает только ключи PHP-сервиса в этом браузере и требует подтверждения.

Политики

Политика конфиденциальности · Политика использования файлов cookie