Есть ли способ совершать транзакции с подготовленными заявлениями?
Я имею в виду, могу ли я использовать следующий пример с $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, где транзакции и подготовленные заявления никогда не смешиваются.
Было бы неправильно использовать их вместе?
Подготовленные заявления и транзакции – это несвязанные методы и технологии.
Вы можете ROLLBACK
команды START TRANSACTION
и COMMIT
/ ROLLBACK
непосредственно вместо использования специальных методов. Они функционально эквивалентны.
Для вашего цикла вы должны отправить START TRANSACTION
перед prepare
, затем ваш COMMIT
после выхода цикла. Вероятно, вы не должны пытаться открыть транзакцию после того, как готовый оператор был запущен, но до его выполнения.
По какой-то причине они не добавили команду «начать транзакцию» в пользу отключения автообмена. Это одна из тех странных вещей о mysqli, которая заставляет меня всегда рекомендовать PDO. 🙂 Открытие транзакции неявно отключает autocommit на время транзакции.