MySQLi Подготовленные Заявления и Транзакции - PullRequest
8 голосов
/ 21 марта 2011

Есть ли способ совершать транзакции с подготовленными выписками?

Я имею в виду, могу ли я использовать следующий пример с $mysqli->autocommit(FALSE); и $mysqli->commit( ); и $mysqli->rollback( );

//Preparing the statment

$insert_stmt=$mysqli->prepare("INSERT INTO x VALUES(?,?)")
or die($mysqli->error);

//associate variables with the input parameters

$insert_stmt->bind_param("is", $my_number,$my_string); //i=integer

//Execute the statement multiple times....

for ($my_number = 1; $my_number <= 10; $my_number++) 
{
    $my_string="row ".$my_number;
    $insert_stmt->execute() or die ($insert_stmt->error);
}
$insert_stmt->close();

Я осмотрелся, но не могу найти ни одного примера использования подготовленных операторов (не PDO): http://php.net/manual/en/mysqli.prepare.php с транзакциями. Я нахожу только примеры, подобные упомянутым здесь: http://book.opensourceproject.org.cn/lamp/mysql/mysqlstored/opensource/0596100892/mysqlspp-chp-13-sect-2.html, где транзакции и подготовленные операторы никогда не смешиваются.

Было бы неправильно использовать их вместе?

1 Ответ

7 голосов
/ 21 марта 2011

Подготовленные заявления и транзакции не связаны между собой методами и технологиями.

Возможно, вы захотите ввести команды START TRANSACTION и COMMIT / ROLLBACK напрямую, вместо использования специальных методов. Они функционально эквивалентны.

Для вашего цикла вы должны выдать START TRANSACTION до вашего prepare, затем ваш COMMIT после выхода из цикла. Вероятно, вам не следует пытаться открыть транзакцию после запуска подготовленного оператора, но до его выполнения.

По какой-то причине они не добавили команду «начать транзакцию» в пользу отключения автоматической фиксации. Это одна из тех странных вещей в mysqli, которая заставляет меня всегда рекомендовать PDO. :) Открытие транзакции неявно отключает автокоммит на время транзакции.

...