2008-11-30 13 views
7

Nun, im Grunde genommen habe ich dieses Skript, das eine lange Zeit benötigt, um ausgeführt zu werden, und manchmal zeitweise aus und lässt halbkomplette Daten um meine Datenbank herum fließen. (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)Wie kann ich Commit/Rollback für MySQL in PHP implementieren?

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 das, wenn der gesamte Prozess innerhalb dieser While-Schleife nicht abgeschlossen ist, ich möchte nicht, dass die Zeile eingefügt bleibt dort. Ich denke, dass ich irgendwie Commits/Rollbacks am Anfang und am Ende der while-Schleife verwenden könnte, um das zu tun, aber ich weiß nicht wie.

Antwort

10

Werfen Sie einen Blick auf this tutorial auf Transaktionen mit PDO.

Grundsätzlich ist die lange Lauf Code in wickeln:

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

Und according to this PDO document page:

„Wenn das Skript endet oder wenn eine Verbindung über geschlossen werden soll, wenn Sie eine Transaktion ausstehen haben, wird PDO automatisch zurückrollen. "

So verlieren Sie die Transaktion, die aus war, als das Skript abgelaufen war.

Aber wirklich, Sie sollten dies so umgestalten, dass es nicht darauf ankommt, dass das Skript am Leben bleibt.

+0

Dank habe ich es noch nicht ausprobiert, aber ich denke, das ist genau das, was ich suche –

1

Sie müssen InnoDB-basierte Tabellen für Transaktionen verwenden und dann eine beliebige Bibliothek wie PDO oder MySQLi verwenden, die sie unterstützt.

-1
<?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>"; 
    } 
} 
?> 
1
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(); 
} 
Verwandte Themen