请注意,调用 mysqli::commit() 不会自动将 mysqli::autocommit() 设置回“true”。
这意味着在您的脚本退出时,mysqli::commit() 之后的任何查询都将回滚。
(PHP 5, PHP 7, PHP 8)
mysqli::commit -- mysqli_commit — 提交当前事务
面向对象风格
过程化风格
提交数据库连接的当前事务。
mysql
仅过程化风格:由 mysqli_connect() 或 mysqli_init() 返回的 mysqli 对象
flags
MYSQLI_TRANS_COR_*
常量的位掩码。
name
如果提供,则执行 COMMIT/*name*/
。
如果启用了 mysqli 错误报告 (MYSQLI_REPORT_ERROR
) 并且请求的操作失败,则会生成警告。此外,如果模式设置为 MYSQLI_REPORT_STRICT
,则会抛出 mysqli_sql_exception。
版本 | 描述 |
---|---|
8.0.0 |
name 现在可以为 null。 |
请参阅 mysqli::begin_transaction() 示例。
注意:
此函数不适用于非事务性表类型(如 MyISAM 或 ISAM)。
请注意,调用 mysqli::commit() 不会自动将 mysqli::autocommit() 设置回“true”。
这意味着在您的脚本退出时,mysqli::commit() 之后的任何查询都将回滚。
我从不建议仅使用一个值变体使用 ?,例如:$var = expression ? $var : other_value 或 $var = expression ? null : other_value,并且 php 支持异常捕获,所以,使用它 :)
这是我对 lorenzo 帖子的看法
<?php
// 变体组合
$mysqli->autocommit(FALSE);
try{
$mysqli->query("INSERT INTO myCity (id) VALUES (100)") or throw new Exception('error!');
// 或者我们可以使用
if( !$mysqli->query("INSERT INTO myCity (id) VALUES (200)"){
throw new Exception('error!');
}
}catch( Exception $e ){
$mysqli->rollback();
}
$mysqli->commit();
?>
这是一个解释回滚和提交函数功能的示例。
假设您希望确保所有查询都必须在写入数据库数据之前无错误地执行。
代码如下
<?php
$all_query_ok=true; // 我们的控制变量
// 我们进行 4 次插入,最后一次会产生错误
// 如果至少有一个查询返回错误,我们更改控制变量
$mysqli->query("INSERT INTO myCity (id) VALUES (100)") ? null : $all_query_ok=false;
$mysqli->query("INSERT INTO myCity (id) VALUES (200)") ? null : $all_query_ok=false;
$mysqli->query("INSERT INTO myCity (id) VALUES (300)") ? null : $all_query_ok=false;
$mysqli->query("INSERT INTO myCity (id) VALUES (100)") ? null : $all_query_ok=false; // 重复的主键值
// 现在让我们测试我们的控制变量
$all_query_ok ? $mysqli->commit() : $mysqli->rollback();
$mysqli->close();
?>
希望能有所帮助!
这是为了阐明 Flags 参数及其含义
MYSQLI_TRANS_COR_AND_CHAIN
将“AND CHAIN”附加到 mysqli_commit 或 mysqli_rollback。
MYSQLI_TRANS_COR_AND_NO_CHAIN
将“AND NO CHAIN”附加到 mysqli_commit 或 mysqli_rollback。
MYSQLI_TRANS_COR_RELEASE
在 mysqli_commit 或 mysqli_rollback 中追加 "RELEASE"。
MYSQLI_TRANS_COR_NO_RELEASE
在 mysqli_commit 或 mysqli_rollback 中追加 "NO RELEASE"。
澄清这些选项
AND CHAIN 子句导致在当前事务结束时立即开始一个新的事务,并且新事务具有与刚刚结束的事务相同的隔离级别。
RELEASE 子句导致服务器在终止当前事务后断开当前客户端会话。
当您需要执行大量事务时,例如您正在从循环中将项目插入到数据库中,最好使用 mysqli_commit 来处理此类过程,因为它只会访问数据库一次。
//错误的方式
示例 1
$con = mysqli_connect("host", "username", "password", "database") or die("无法建立与数据库的连接");
$users = ["chris", "james", "peter", "mark", "joe", "alice", "bob"]
for($i=0; $i<count($users); $i++){
$user= $users[$i];
$query = mysqli_query($con, "INSERT INTO users (username) VALUES ('$user') ");
}
//正确的方式
示例 2
$con = mysqli_connect("host", "username", "password", "database") or die("无法建立与数据库的连接");
$users = ["chris", "james", "peter", "mark", "joe", "alice", "bob"]
//关闭自动提交
mysqli_autocommit($con, FALSE)
//执行一些事务
for($i=0; $i<count($users); $i++){
$user= $users[$i];
$query = mysqli_query($con, "INSERT INTO users (username) VALUES ('$user') ");
}
//对数据库进行一次性访问
mysqli_commit($con)
与示例 1 一样,由于列表中有 7 个项目,这意味着将对我们的数据库进行 7 次访问,这可能会严重影响性能。但是,在示例 2 中,由于我们已经关闭了自动提交,这意味着事务将排队,直到我们显式调用 mysqli_commit($con)