7

基本的に、このスクリプトは実行に時間がかかり、タイムアウトすることもあり、データベースの周りに半完全なデータが残っています。(はい、完璧な世界では、コミットとロールバックを実装する代わりにそれを修正することを知っていますが、そうしないことを余儀なくされています)

これが私の基本的なコードです(簡単にするために簡略化しています):

$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

4 に答える 4

10

PDO とのトランザクションに関するこのチュートリアルを見てください。

基本的に、長時間実行されるコードを次のようにラップします。

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

そして、このPDOドキュメントページによると

"スクリプトが終了するとき、または接続が閉じられようとしているときに、未処理のトランザクションがある場合、PDO は自動的にそれをロールバックします。"

そのため、スクリプトがタイムアウトしたときに保留されていたトランザクションが失われます。

しかし、実際には、スクリプトが生きていることに依存しないように、これを再設計する必要があります。

于 2008-11-30T23:52:14.063 に答える
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();
}
于 2010-12-10T10:08:52.297 に答える
1

トランザクションには InnoDB ベースのテーブルを使用し、それらをサポートする PDO や MySQLi などのライブラリを使用する必要があります。

于 2008-11-30T23:53:50.067 に答える
-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>";
    }
}
?>
于 2009-03-09T08:42:12.547 に答える