嗯,基本上我有这个脚本,需要很长的时间来执行,偶尔超时和叶半完成数据漂浮我的数据库。 (是的,我知道在一个完美的世界,我会解决的,与其实施提交和回滚,但我不得不这样做)

下面是我的基本代码(简单化为简单起见):

$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循环做到这一点的开头和结尾,但不知道怎么办。

有帮助吗?

解决方案

看看的交易本教程与PDO。

基本上包裹在长时间运行的代码:

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

href="http://usphp.com/manual/en/ref.pdo.php" rel="noreferrer">:

“当脚本结束或当连接是即将关闭,如果有未完成的事务,PDO将自动回滚。”

所以,你将失去在脚本超时这是悬而未决的事务。

不过说真的,你应该重新设计这种因此它不依赖于scriipt活着。

其他提示

您需要使用基于InnoDB表进行交易,然后使用任何库一样,支持他们PDO或MySQLi的。

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>";
    }
}
?>
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top