Я долго ломал голову над этим ....
У меня есть объект PDO с pdo-> setAttribute (PDO :: ATTR_AUTOCOMMIT, 0);
, поскольку я хочу использовать FOR UPDATE
с некоторыми таблицами InnoDB. При чтении документации MySQL FOR UPDATE
блокирует чтение строк, только если:
устанавливаете autocommit = 0
было выдано Итак, я использую ATTR_AUTOCOMMIT
, чтобы позволить объекту PDO блокировать строки. В любом случае это приводит к тому, что операторы INSERT и UPDATE не применяются. Эти операторы не имеют ничего общего с FOR UPDATE
, они просто проходят через один и тот же объект PDO с подготовленными операторами.
Мой журнал запросов MySQL выглядит так:
xxx Connect user@host
xxx Query set autocommit=0
xxx Query INSERT INTO foo_tbl (bar, baz) VALUES ('hello','world')
xxx Quit
PHP / PDO не жалуется, но выбор из таблицы показывает, что данные не были записаны.
Запросы, которые я выполняю, выполнялись тысячи раз назад; внесено только изменение ATTR_AUTOCOMMIT
. Удаление этой опции заставляет все снова работать. Транзакции работают нормально с опцией autocommit = 0
тоже.
Существуют ли дополнительные вызовы, которые необходимо сделать для объекта PDO ( commit ()
правильно жалуется, что его нет в транзакцию), чтобы изменения прижились? По сути, мне нужен простой объект PDO, но с возможностью блокировки строк вне транзакций для таблиц InnoDB (фон, почему здесь слишком длинный и скучный).
Я уверен, что это что-то глупое, которого я упускаю почесал голову