How can I implement commit/rollback for MySQL in PHP?

前端 未结 4 1612
南方客
南方客 2020-12-18 03:32

Well basically I have this script that takes a long time to execute and occasionally times out and leaves semi-complete data floating around my database. (Yes I know in a pe

相关标签:
4条回答
  • 2020-12-18 03:39

    Take a look at this tutorial on transactions with PDO.

    Basically wrap the long running code in:

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

    And according to this PDO document page:

    "When the script ends or when a connection is about to be closed, if you have an outstanding transaction, PDO will automatically roll it back. "

    So you will lose the transaction that was pending when the script timed out.

    But really, you ought to redesign this so that it doesn't depend on the scriipt staying alive.

    0 讨论(0)
  • 2020-12-18 03:42

    You need to use InnoDB based tables for transactions then use any library like PDO or MySQLi that supports them.

    0 讨论(0)
  • 2020-12-18 03:55
    <?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>";
        }
    }
    ?>
    
    0 讨论(0)
  • 2020-12-18 04:01
    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();
    }
    
    0 讨论(0)
提交回复
热议问题