【问题标题】:mysql - how to check and rollback mySql queriesmysql - 如何检查和回滚 mySql 查询
【发布时间】:2020-12-18 07:30:13
【问题描述】:

我对使用 PHP 进行的 mySql 查询有疑问 -

在我的代码中,我将数据插入到表 main_query 中。如果插入部分很好,我会进行第二次插入查询 - sub_query。

如果第二个插入查询失败,我如何取消第一个插入查询?我的意思是 - 是否可以在我实际执行它们之前发送两个查询进行检查?或者 - 是否可以对第一个“main_query”查询进行回滚?

$main_query = "INSERT INTO table_1 (...) VALUES (...)";
$res = $conn->query($main_query);

if ($res)
{
    $id = mysqli_insert_id($conn);
    
    $sub_query = "INSERT INTO table_2 (...) VALUES (...)"; // use var "id" here
    $res = $conn->query($sub_query);
}

【问题讨论】:

    标签: php mysql mysqli transactions


    【解决方案1】:

    在这种情况下,您需要使用transactionsrollback

    # start mysql transaction
    mysqli_begin_transaction($conn, MYSQLI_TRANS_START_READ_WRITE);
    
    $main_query = "INSERT INTO table_1 (...) VALUES (...)";
    $res = mysqli_query($conn, $main_query);
    
    if ($res)
    {
        $id = mysqli_insert_id($conn);
        
        $sub_query = "INSERT INTO table_2 (...) VALUES (...)"; // use var "id" here
        $res = mysqli_query($conn, $sub_query);
        if ($res) {
            # both inserts succeed - do commit
            mysqli_commit($conn);
        }
        else {
            # second insert fail - do rollback
            mysqli_rollback($conn); 
        }
    } else  {
        # first insert fail - do rollback
        mysqli_rollback($conn); 
    }
    

    或者我们可以使用面向对象的样式,例如:

    # start mysql transaction
    $mysqli->begin_transaction(MYSQLI_TRANS_START_READ_WRITE);
    
    $main_query = "INSERT INTO table_1 (...) VALUES (...)";
    $res = $mysqli->query($main_query);
    
    if ($res)
    {
        $id = $mysqli->insert_id;
    
        $sub_query = "INSERT INTO table_2 (...) VALUES (...)"; // use var "id" here
        $res = $mysqli->query($sub_query);
        if ($res) {
            # both inserts succeed - do commit
            $mysqli->commit();
        }
        else {
            # second insert fail - do rollback
            $mysqli->rollback(); 
        }
    } else  {
        # first insert fail - do rollback
        $mysqli->rollback(); 
    }
    

    在这里查看工作示例PHPize.online

    【讨论】:

    • 嗨 Slava - 你是说$mysqli->begin_transaction(MYSQLI_TRANS_START_READ_ONLY); 吗?
    • 还有 - $link 是什么?是我的$conn 吗?
    • 对不起,我的错。同一个 $conn 中的 $link。您也可以使用面向对象的风格 $mysqli->begin_transaction(MYSQLI_TRANS_START_READ_ONLY); 或函数风​​格的 mysqli_begin_transaction($conn, MYSQLI_TRANS_START_READ_ONLY)
    • 好的,但在你的例子中,我能取回 $id 值吗? $id = mysqli_insert_id($conn); 并将其用于第二个查询?
    • 我收到以下错误:Cannot execute statement in a READ ONLY transaction。你确定MYSQLI_TRANS_START_READ_ONLY 吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-14
    • 1970-01-01
    • 2013-04-14
    • 1970-01-01
    • 2022-11-04
    • 2015-09-11
    • 1970-01-01
    相关资源
    最近更新 更多