代码之家  ›  专栏  ›  技术社区  ›  Devner

php&mysql:实现事务的简单代码-提交和回滚

  •  5
  • Devner  · 技术社区  · 15 年前

    我的平台:

    PHP与MySQL

    我的处境:

    我正试图在代码中实现事务。我试着举例,但没什么帮助。我正在运行3个查询,我希望以这样的方式编写一个事务,以便在任何一个查询失败时,整个事务都可以回滚。我真的很感激一个简单、高效和 非面向对象的PHP代码 为了实现这个目标。提前谢谢。

    我的PHP代码:

    //db_res calls a custom function that performs a mysql_query on the query
    $res1 = db_res("SELECT c1, c2 FROM t1 WHERE c5 = 3");
    $res2 = db_res("UPDATE t2 SET c1 = 5 WHERE c2 = 10");
    $res3 = db_res("DELETE FROM t3 WHERE c1 = 20");
    
    if( $res1 && $res2 && $res3 )
    {
     //commit --- but how?
    }
    else
    {
     //rollback --- but how?
    }
    
    2 回复  |  直到 11 年前
        1
  •  6
  •   John Conde    15 年前

    你需要使用 mysqli extension 使用此功能。

    参见: autocommit() , commit() rollback()

    <?php
    $link = mysqli_connect("localhost", "my_user", "my_password", "world");
    
    /* check connection */
    if (mysqli_connect_errno()) {
        printf("Connect failed: %s\n", mysqli_connect_error());
        exit();
    }
    
    /* disable autocommit */
    mysqli_autocommit($link, FALSE);
    
    mysqli_query($link, "CREATE TABLE myCity LIKE City");
    mysqli_query($link, "ALTER TABLE myCity Type=InnoDB");
    mysqli_query($link, "INSERT INTO myCity SELECT * FROM City LIMIT 50");
    
    /* commit insert */
    mysqli_commit($link);
    
    /* delete all rows */
    mysqli_query($link, "DELETE FROM myCity");
    
    if ($result = mysqli_query($link, "SELECT COUNT(*) FROM myCity")) {
        $row = mysqli_fetch_row($result);
        printf("%d rows in table myCity.\n", $row[0]);
        /* Free result */
        mysqli_free_result($result);
    }
    
    /* Rollback */
    mysqli_rollback($link);
    
    if ($result = mysqli_query($link, "SELECT COUNT(*) FROM myCity")) {
        $row = mysqli_fetch_row($result);
        printf("%d rows in table myCity (after rollback).\n", $row[0]);
        /* Free result */
        mysqli_free_result($result);
    }
    
    /* Drop table myCity */
    mysqli_query($link, "DROP TABLE myCity");
    
    mysqli_close($link);
    ?>
    
        2
  •  14
  •   rjmunro    11 年前

    你不需要使用mysqli。您只需发出事务命令作为查询。

    因此,举个例子:

    mysql_query("start transaction;");
    
    //db_res calls a custom function that performs a mysql_query on the query
    $res1 = db_res("SELECT c1, c2 FROM t1 WHERE c5 = 3");
    $res2 = db_res("UPDATE t2 SET c1 = 5 WHERE c2 = 10");
    $res3 = db_res("DELETE FROM t3 WHERE c1 = 20");
    
    if( $res1 && $res2 && $res3 )
    {
      mysql_query("commit;");
    }
    else
    {
      mysql_query("rollback;");
    }
    

    顺便说一下,如果你想升级到mysqli,请不要这样做。升级到pdo,它会更加健全。