Как я могу реализовать коммит / откат для MySQL в PHP? - PullRequest
7 голосов
/ 01 декабря 2008

Ну, в принципе, у меня есть этот сценарий, выполнение которого занимает много времени, а иногда время ожидания истекает, и полунаполненные данные остаются в моей базе данных. (Да, я знаю, что в идеальном мире я бы исправил ТО, вместо того чтобы реализовывать коммиты и откаты, но я вынужден этого не делать)

Вот мой основной код (для простоты):

$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 не завершен, я не хочу, чтобы вставленная строка оставалась там. Я думаю, что каким-то образом я мог бы использовать коммиты / откаты в начале и в конце цикла while, чтобы сделать это, но не знаю как.

Ответы [ 4 ]

10 голосов
/ 01 декабря 2008

Взгляните на этот учебник по транзакциям с PDO.

В основном обернуть длинный код в:

$dbh->beginTransaction();
...
$dbh->commit();

И согласно этой странице документа PDO :

"Когда сценарий завершается или когда соединение будет закрыто, если у вас есть ожидающая транзакция, PDO автоматически откатит ее."

Таким образом, вы потеряете транзакцию, которая находилась на рассмотрении по истечении времени ожидания сценария.

Но на самом деле, вы должны изменить его, чтобы он не зависел от того, останется ли скрипт в живых.

1 голос
/ 10 декабря 2010
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();
}
1 голос
/ 01 декабря 2008

Вам необходимо использовать таблицы InnoDB для транзакций, а затем использовать любую библиотеку, такую ​​как PDO или MySQLi, которая их поддерживает.

0 голосов
/ 09 марта 2009
<?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>";
    }
}
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...