Классические транзакции в цикле:
$mysqli->query("START TRANSACTION"); foreach ($pdata as $key => $value) { $sql = "INSERT INTO temp (`fund_id`) VALUES (" . $value . ")"; $result = $mysqli->query($sql); } $mysqli->query("COMMIT");
Затем мы переходим к подготовленным заявлениям:
$mysqli->autocommit(FALSE); foreach ($pdata as $key => $value) { $sql = "INSERT INTO temp (`fund_id`) VALUES (?)"; $stmt = $mysqli->prepare($sql); $stmt->bind_param('i', $value); $stmt->execute(); } $mysqli->commit();
Вопросов:
1) идентичны ли эти два кода? Я что-то пропустил во втором коде с подготовленными заявлениями?
2) Является ли $mysqli->commit()
тем же, что и $mysqli->query("COMMIT")
?
3) Нужно ли добавлять $mysqli->query("START TRANSACTION");
для блока подготовленных операторов или транзакция автоматически запустится, когда мы установим autocommit(FALSE)
?
Ваш цикл можно оптимизировать, вытащив инструкции prepare
и bind_param
из цикла.
$value = null; $mysqli->autocommit(FALSE); $sql = "INSERT INTO temp (`fund_id`) VALUES (?)"; $stmt = $mysqli->prepare($sql); $stmt->bind_param('i', $value); foreach ($pdata as $value) { $stmt->execute(); } $mysqli->commit();
Вы отключили автосообщение со своей линией autocommit(FALSE)
и поэтому вам не нужно использовать инструкцию START TRANSACTION
.