PHP подготовил операторы и транзакции в цикле

Классические транзакции в цикле:

$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 .