Domanda

Beh, fondamentalmente ho questo script che richiede molto tempo per l'esecuzione e occasionalmente scade e lascia i dati semi-completi fluttuanti nel mio database. (Sì, lo so in un mondo perfetto, aggiusterò CHE invece di implementare commit e rollback ma sono costretto a non farlo)

Ecco il mio codice di base (stupito per semplicità):

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

Quindi il mio problema è che se l'intero processo all'interno di quel ciclo while non è completo, non voglio che la riga inserita rimanga lì. Penso che in qualche modo potrei usare commit / rollback all'inizio e alla fine del ciclo while per fare questo, ma non so come.

È stato utile?

Soluzione

Dai un'occhiata a questo tutorial sulle transazioni con DOP.

Fondamentalmente racchiudi il codice di lunga durata in:

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

E secondo questa pagina del documento DOP :

" Quando lo script termina o quando una connessione sta per essere chiusa, se si dispone di una transazione in sospeso, PDO lo ripristinerà automaticamente. & Quot;

Quindi perderai la transazione in sospeso al termine dello script.

Ma davvero, dovresti ridisegnarlo in modo che non dipenda dal fatto che la scrittura rimanga in vita.

Altri suggerimenti

È necessario utilizzare le tabelle basate su InnoDB per le transazioni, quindi utilizzare qualsiasi libreria come PDO o MySQLi che le supporti.

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>";
    }
}
?>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top