为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
温温酱 2023-11-05 15:44:19
我有一个关于我使用 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);}
查看完整描述

1 回答

?
慕森王

TA贡献1777条经验 获得超3个赞

在这种情况下,您需要使用事务和回滚:

# 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


查看完整回答
反对 回复 2023-11-05
  • 1 回答
  • 0 关注
  • 73 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信