PDO :: ATTR_AUTOCOMMIT игнорирует нетранзакционные INSERT / UPDATE

Я долго ломал голову над этим ....

У меня есть объект PDO с pdo-> setAttribute (PDO :: ATTR_AUTOCOMMIT, 0); , поскольку я хочу использовать FOR UPDATE с некоторыми таблицами InnoDB. При чтении документации MySQL FOR UPDATE блокирует чтение строк, только если:

  1. Вы участвуете в транзакции
  2. Вы не в транзакции и устанавливаете 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 (фон, почему здесь слишком длинный и скучный).

Я уверен, что это что-то глупое, которого я упускаю почесал голову

9
задан Aiden Bell 10 April 2013 в 06:20
поделиться