mysql - 如何检查和回滚 mySql 查询

mysql - how to check and rollback mySql queries

我有一个关于 mySql 查询的问题,我使用 PHP 进行查询 -

在我的代码中,我将数据插入 table - 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);
}

在这种情况下你需要使用transactions and rollback:

# 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