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
我有一个关于 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