Ну, в основном у меня есть этот скрипт, который занимает много времени, чтобы выполнять, а иногда и время, и оставляет полуполные данные, плавающие вокруг моей базы данных. (Да, я знаю, что в идеальном мире я бы исправил ТО вместо того, чтобы выполнять коммиты и откаты, но я вынужден не делать этого)
Вот мой базовый код (пошатнулся для простоты):
$database = new PDO("mysql:host=host;dbname=mysql_db","username","password"); while (notDone()) { $add_row = $database->prepare("INSERT INTO table (columns) VALUES (?)"); $add_row->execute(array('values')); //PROCESSING STUFF THAT TAKES A LONG TIME GOES HERE } $database = null;
Поэтому моя проблема заключается в том, что если это произойдет, если весь процесс в этом цикле while не будет завершен, я не хочу, чтобы вставленная строка оставалась там. Я думаю, что каким-то образом я мог использовать commits / rollbacks в начале и конце цикла while, но не знаю, как это сделать.
Взгляните на это руководство по транзакциям с PDO.
В основном оберните длинный код в:
$dbh->beginTransaction(); ... $dbh->commit();
И согласно этой странице документа PDO :
«Когда скрипт заканчивается или когда соединение будет закрыто, если у вас есть невыполненная транзакция, PDO автоматически откатит его».
Таким образом, вы потеряете транзакцию, ожидающую завершения срока действия скрипта.
Но на самом деле, вы должны переделать это так, чтобы это не зависело от того, чтобы оставаться в живых.
Вам нужно использовать таблицы на основе InnoDB для транзакций, а затем использовать любую библиотеку, такую как PDO или MySQLi, которая их поддерживает.
try { $mysqli->autocommit(FALSE); $mysqli->query("insert into tblbook (id,cid,book) values('','3','book3.1')"); echo $q_ins=$mysqli->affected_rows."<br>"; $mysqli->query("update tblbook set book='book3' where cid='3'"); echo $q_upd=$mysqli->affected_rows."<br>"; $mysqli->commit(); } catch(PDOException $e) { $mysqli->rollback(); echo $sql . '<br />' . $e->getMessage(); }
<?php //This may help someone....This code commit the transactions //only if both queries insert and update successfully runs $mysqli=new mysqli("localhost","user_name","password","db_name"); if(mysqli_connect_errno()) { echo "Connection failed: ".mysqli_connect_error(); } else { $mysqli->autocommit(FALSE); $mysqli->query("insert into tblbook (id,cid,book) values('','3','book3.1')"); echo $q_ins=$mysqli->affected_rows."<br>"; $mysqli->query("update tblbook set book='book3' where cid='3'"); echo $q_upd=$mysqli->affected_rows."<br>"; if($q_ins==1 && $q_upd==1) { $mysqli->commit(); echo "Commit<br>"; } else { $mysqli->rollback(); echo "Rollback<br>"; } } ?>