Насколько я понял, транзакция начинается, когда мы вызываем $mysqli->autocommit(FALSE);
и заканчивается после вызова $mysqli->commit();
как в приведенном ниже примере.
<?php //Start transaction $mysqli->autocommit(FALSE); $mysqli->query('UPDATE `table` SET `col`=2'); $mysqli->query('UPDATE `table1` SET `col1`=3;'); $mysqli->commit(); //End transaction //Executing other queries without transaction control $mysqli->query("Select * from table1"); $mysqli->query("Update table1 set col1=2"); //End of executing other queries without transaction control //Start transaction $mysqli->autocommit(FALSE); $mysqli->query('UPDATE `table` SET `col`=2'); $mysqli->query('UPDATE `table1` SET `col1`=3;'); $mysqli->commit(); //End transaction ?>
Правильно ли я понял? Если бы вы не могли поправить меня, потому что на самом деле я впервые использовал транзакции в реальной жизни.
Спасибо.
Ну, согласно php doc , вы правы.
<?php $mysqli = new mysqli("localhost", "my_user", "my_password", "world"); /* check connection */ if (mysqli_connect_errno()) { printf("Connect failed: %s\n", mysqli_connect_error()); exit(); } $mysqli->query("CREATE TABLE Language LIKE CountryLanguage"); /* set autocommit to off */ $mysqli->autocommit(FALSE); /* Insert some values */ $mysqli->query("INSERT INTO Language VALUES ('DEU', 'Bavarian', 'F', 11.2)"); $mysqli->query("INSERT INTO Language VALUES ('DEU', 'Swabian', 'F', 9.4)"); /* commit transaction */ $mysqli->commit(); /* drop table */ $mysqli->query("DROP TABLE Language"); /* close connection */ $mysqli->close(); ?>
В приведенном выше примере:
CREATE TABLE
автоматически фиксируется, потому что это поведение по умолчанию. INSERT INTO
не автоблокируются из-за autocommit(FALSE)
DROP TABLE
автоматически фиксируется, потому что autocommit(FALSE)
был сброшен с помощью ->commit();
, j0k в основном правилен, за исключением таблицы сбрасывания.
Автоматическая фиксация не включается с помощью -> commit ()
Вместо этого DROP TABLE является DDL-запросом, и запросы DDL всегда неявно совершаются и будут выполнять все ваши ранее неработающие работы.
Итак, если вы не выполнили работу, запрос DDL заставит это совершить.
Вы считаете, что команда «commit» автоматически переключает автообщение обратно на true? Комментарий в php doc говорит НЕТ!
Подготовьте инструкцию SQL ONCE, а затем выполните ее БОЛЬШЕ ВРЕМЕНИ:
<?php $Mysqli = new mysqli("host","user","pass","base"); // check connection if (mysqli_connect_errno()) { printf("Connect failed: %s\n", mysqli_connect_error()); exit(); } // some data for db insertion $langs=['Bavarian','Schwabian']; // explicitly begin db transaction $Mysqli->begin_transaction(); // prepare statement for multiple inserts once $stmt=$Mysqli->prepare("INSERT INTO table(column) VALUES(?)"); // bind prepared statement with variable $lang $stmt->bind_param('s',$lang); // loop for inserting $langs array values foreach($langs as $lang) { //execute prep stat more times with new values if(!$stmt->execute()) { // rollback if prep stat execution fails $Mysqli->rollback(); // exit or throw an exception exit(); } } // close prepared statement $stmt->close(); // commit transaction $Mysqli->commit(); // close connection $Mysqli->close(); ?>