Я потратил огромное количество времени на обход этой проблемы, и документация PHP в этой области в лучшем случае расплывчатая.Несколько вещей, которые я обнаружил, работая с PHP 7 с таблицей MySQL InnoDB:
PDO :: beginTransaction не просто отключает автокоммит , проверив ответ, предоставленный Ольховским, с кодом, которыйсбои, откаты не работают;нет транзакционного поведения.Это означает, что это не может быть так просто.
Начало транзакции может блокировать используемые таблицы ... Я с нетерпением жду, когда кто-нибудь скажет мне, что я не прав с этим, ноВот причины, по которым это может быть: Этот комментарий , который показывает, что таблица недоступна при запуске транзакции без блокировки. Эта страница документации PHP , которая вставляется в конце:
... пока транзакция активна, вы гарантированно, что никто другой не сможет вносить изменения, пока вы находитесь всередина вашей работы
Для меня это поведение довольно умное, а также предоставляет достаточно места для маневра, чтобы PDO мог справиться с любой базой данных, что в конечном итоге является целью.Однако, если это то, что происходит, это просто в значительной степени недокументировано и должно было называться как-то иначе, чтобы избежать путаницы с настоящей транзакцией базы данных, которая не подразумевает блокировку.
Ответ Чарльза, я думаю, таков:вероятно, лучше всего, если вам нужна определенная нагрузка, которая потребует высокого уровня параллелизма;сделайте это вручную, используя явные запросы к базе данных, затем вы можете перейти к документации базы данных.
Обновление У меня был рабочий сервер, работающий с использованием функций транзакций PDO некоторое времятеперь, недавно используя базу данных Aurora AWS (полностью совместима с MySQL, но создана для автоматического масштабирования и т. д.).Я доказал эти два момента самому себе:
- Транзакции (просто возможность фиксировать все изменения базы данных вместе) работают с использованием PDO :: beginTransaction ().Короче говоря, я знаю, что многие сценарии потерпели неудачу на полпути при выборе / обновлении базы данных, и была сохранена целостность данных.
- Блокировка таблицы не происходит, у меня была ошибка дублирования индекса, чтобы доказать это.
Итак, в заключение, похоже, что поведение этих функций меняется в зависимости от механизма базы данных (и, возможно, других факторов).Насколько я могу судить по опыту и документации, невозможно программно узнать, что происходит ... хм ...