Intereting Posts
Пароль не совпадает после шифрования с использованием функций crypt () и password_hash () обнаружить текущую вкладку Получить идентификатор видео Youtube из html-кода с помощью PHP Неустранимая ошибка: класс «Монго» не найден в C: \\ Apache Software Foundation \ Apache2.2 \ htdocs \ sample \ testdb.php Как использовать метод findBy со сравнительными критериями Если бы я мог заблокировать несколько таблиц, было бы плохо? Как вызвать RESTful WCF-Service из PHP Использование действия формы HTML с php-скриптом, находящимся в другом каталоге (относительные пути) PHP: Разделить строку на массив, например, разбить без разделителя Codeigniter: вложение электронной почты последних сообщений электронной почты не очищается при отправке нескольких писем в цикле PHP – простой HTML DOM Parser – проблема с таблицей Создание новых переменных из ключей массива в PHP Doctrine 2.5 Неожиданное поведение выборки ассоциации путь изображения symfony работает только без порта Нестатический метод mysqli :: init () нельзя назвать статическим

PHP & mySQL: простой код для реализации транзакции – фиксация и откат

МОЯ ПЛАТФОРМА:

PHP и mySQL

МОЯ СИТУАЦИЯ:

Я пытаюсь реализовать транзакции в своем коде. Я пытался следовать примерам, но это не очень помогает. Я запускаю 3 запроса, и я хотел написать транзакцию таким образом, чтобы, если какой-либо запрос (ы) не прошел, вся транзакция должна откат. Я бы очень оценил простой, эффективный и не объектно-ориентированный PHP-код для достижения этой цели. Заранее спасибо.

MY PHP CODE:

//db_res calls a custom function that performs a mysql_query on the query $res1 = db_res("SELECT c1, c2 FROM t1 WHERE c5 = 3"); $res2 = db_res("UPDATE t2 SET c1 = 5 WHERE c2 = 10"); $res3 = db_res("DELETE FROM t3 WHERE c1 = 20"); if( $res1 && $res2 && $res3 ) { //commit --- but how? } else { //rollback --- but how? } 

Для использования этой функции вам необходимо использовать расширение mysqli .

Смотрите: autocommit () , commit () и rollback ()

 <?php $link = mysqli_connect("localhost", "my_user", "my_password", "world"); /* check connection */ if (mysqli_connect_errno()) { printf("Connect failed: %s\n", mysqli_connect_error()); exit(); } /* disable autocommit */ mysqli_autocommit($link, FALSE); mysqli_query($link, "CREATE TABLE myCity LIKE City"); mysqli_query($link, "ALTER TABLE myCity Type=InnoDB"); mysqli_query($link, "INSERT INTO myCity SELECT * FROM City LIMIT 50"); /* commit insert */ mysqli_commit($link); /* delete all rows */ mysqli_query($link, "DELETE FROM myCity"); if ($result = mysqli_query($link, "SELECT COUNT(*) FROM myCity")) { $row = mysqli_fetch_row($result); printf("%d rows in table myCity.\n", $row[0]); /* Free result */ mysqli_free_result($result); } /* Rollback */ mysqli_rollback($link); if ($result = mysqli_query($link, "SELECT COUNT(*) FROM myCity")) { $row = mysqli_fetch_row($result); printf("%d rows in table myCity (after rollback).\n", $row[0]); /* Free result */ mysqli_free_result($result); } /* Drop table myCity */ mysqli_query($link, "DROP TABLE myCity"); mysqli_close($link); ?> 

Вам не нужно использовать mysqli. Вы можете просто выдать команды транзакций в качестве запросов.

Итак, для вашего примера:

 mysql_query("start transaction;"); //db_res calls a custom function that performs a mysql_query on the query $res1 = db_res("SELECT c1, c2 FROM t1 WHERE c5 = 3"); $res2 = db_res("UPDATE t2 SET c1 = 5 WHERE c2 = 10"); $res3 = db_res("DELETE FROM t3 WHERE c1 = 20"); if( $res1 && $res2 && $res3 ) { mysql_query("commit;"); } else { mysql_query("rollback;"); } 

Кстати, если вы думаете об обновлении до mysqli, не делайте этого. Вместо этого переходите к PDO, это намного более разумно.