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

您需要使用基于 InnoDB 的表进行事务,然后使用任何支持它们的库,如 PDO 或 MySQLi。

于 2008-11-30T23:53:50.067 回答
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
<?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 回答