Intereting Posts
Автосохранение ввода формы с использованием прототипа и PHP Календар Google 403 Запрещенный обмен PHP-сервером на сервер Нечеткость WordPress со сломанными изображениями (часть 2) php выполняет фоновый процесс utf8_encode и Emoji Перезагрузка nginx & php5-fpm не обновляет изменения в php.ini Преобразование массива из одного в многомерный на основе значений родительского идентификатора PHP HTTP POST на Android-устройстве с использованием HttpURLConnection Как получить эскиз сообщения эскиза PHP держит меня от eval;) Переменные внутри строки Zend Framework 2 – AJAX Запрос с другого сервера Выполнение урока Laravel, получение «Базовой таблицы или представления не найдено: 1146 Таблица« sdbd_todo.migrations »не существует» Чтение и запись на / из последовательного устройства через USB на Linux с помощью Perl или PHP apc vs eaccelerator vs xcache regex: если строка содержит определенное слово внутри скобки, то удалите скобку и ее содержимое

Как начать и завершить транзакцию в mysqli?

Насколько я понял, транзакция начинается, когда мы вызываем $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 ?> 

Правильно ли я понял? Если бы вы не могли поправить меня, потому что на самом деле я впервые использовал транзакции в реальной жизни.

Спасибо.

Solutions Collecting From Web of "Как начать и завершить транзакцию в mysqli?"

Ну, согласно 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(); ?>