2012-04-22 3 views
8

В документации MySQL, есть примечание об использовании mysql_affected_rows после фиксации транзакции: http://php.net/manual/en/function.mysql-affected-rows.phpPDOStatement :: rowCount результат при использовании после PDO :: commit?

Примечание: Операции
Если вы используете транзакции, вам нужно позвонить mysql_affected_rows() после ваш запрос INSERT, UPDATE или DELETE, а не после COMMIT.

Однако нет такого примечания на PDOStatement::rowCount документе: http://www.php.net/manual/en/pdostatement.rowcount.php

Означает ли это обязательство не будет влиять на подсчет измененных строк после того, как INSERT, UPDATE или DELETE запросов при использовании PDO объекта?

+0

после фиксации значение 'affected_rows' становится неясным. Общее количество строк, затронутых транзакцией ENTIRE? Или это просто количество строк, сделанных последней операцией в транзакции? Если были вложенные транзакции, которые были отброшены назад, должны быть подсчитаны любые строки, затронутые/отмененные, и т. Д. –

+0

@MarcB. Дело в том, что это 'PDOStatement-> rowCount()' ie NOT 'PDO-> rowCount() 'поэтому СЛЕДУЕТ считать строку последним запросом не последней транзакцией. – Ozzy

+0

mysql_affected_rows() - это еще один способ сделать PDOStatement-> rowCount(). Оба могут быть вызваны только после выполнения MySQL, поскольку в противном случае никакие строки не будут затронуты. –

ответ

12

PDOStatement возвращается для каждого выполненного запроса. Вы сможете использовать PDOStatement-> rowCount() в любое время в вашем коде (во время или после транзакции, а rollback/commit не имеет значения). Каждый объект заботится о сохранении себя.

Причина, по которой mysql_affected_rows имеет эту заметку о транзакции, заключается в том, что она знает только об одном ресурсе соединения mysql. Это означает, что когда вы завершаете транзакцию (фиксация/откат), новый запрос отправляется в БД, таким образом изменяя, какой результат обрабатывается для количества затронутых строк.

Смежные вопросы