Frage

Also im Grunde habe ich das Skript, das eine lange Zeit dauert, um meine Datenbank auszuführen und gelegentlich mal aus und verlassen halbfertige Daten schweben. (Ja, ich weiß in einer perfekten Welt würde ich fix, dass anstelle von Commits und Rollbacks Umsetzung aber ich gezwungen bin, das nicht zu tun)

Hier ist mein Grundcode (verdummt der Einfachheit halber):

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

Also mein Problem ist, dass, wenn, dass, wenn der gesamte Prozess innerhalb dieser while-Schleife nicht vollständig ist, dann will ich nicht die Zeile eingefügt, dort zu bleiben. Ich denke, dass ich irgendwie Commits / Rollbacks am Anfang und am Ende der while-Schleife, dies zu tun verwenden könnte, aber nicht wissen, wie.

War es hilfreich?

Lösung

Hier finden Sie aktuelle diesem Tutorial auf Transaktionen mit PDO.

Im Grunde wickeln den langen Lauf Code in:

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

Und nach diesem PDO Dokument :

„Wenn das Skript endet oder wenn eine Verbindung über geschlossen werden soll, wenn Sie eine Transaktion ausstehen haben, PDO automatisch wieder rollen.“

Sie werden also die Transaktion verlieren, die anhängig war, wenn das Skript abgelaufen.

Aber wirklich, Sie sollten diese neu zu gestalten, so dass sie nicht auf dem scriipt hängen am Leben zu bleiben.

Andere Tipps

Sie müssen InnoDB basierte Tabellen verwenden, um Transaktionen dann jede Bibliothek wie PDO oder MySQLi verwenden, die sie unterstützt.

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>";
    }
}
?>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top