Question

Eh bien, fondamentalement, j'ai ce script qui prend beaucoup de temps à exécuter et, parfois, il arrive à expiration et laisse des données semi-complètes flottant autour de ma base de données. (Oui, je sais que dans un monde parfait, je corrigerais CELA au lieu de mettre en œuvre les validations et les rétrogradations, mais je suis obligé de ne pas le faire.)

Voici mon code de base (simplifié):

$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;

Donc, mon problème est que si si tout le processus dans cette boucle while n'est pas terminé, je ne veux pas que la ligne insérée y reste. Je pense que je pourrais utiliser des commits / annulations au début et à la fin de la boucle while pour le faire, mais je ne sais pas comment.

Était-ce utile?

La solution

Jetez un coup d’œil à ce tutoriel sur les transactions avec AOP.

Enveloppez le code long dans:

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

Et conformément à cette page de document PDO :

" À la fin du script ou lorsqu'une connexion est sur le point de fermer, si vous avez une transaction en attente, PDO la restaure automatiquement. "

Vous perdrez donc la transaction en attente à l'expiration du délai du script.

Mais, en réalité, vous devriez repenser cela pour que le scriipt ne reste pas en vie.

Autres conseils

Vous devez utiliser des tables InnoDB pour les transactions, puis utiliser n'importe quelle bibliothèque PDO ou MySQLi qui les prend en charge.

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>";
    }
}
?>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top