当前位置: 首页> 最新文章列表> mysqli::begin_transaction 函数的基本用法是什么?详细介绍它如何启动事务

mysqli::begin_transaction 函数的基本用法是什么?详细介绍它如何启动事务

gitbox 2025-08-17

1. 什么是事务?

事务的基本概念是“要么全部成功,要么全部失败”。如果事务中的某一操作失败,事务中的所有操作都将被回滚(撤销)。事务通常包含以下四个特性(ACID原则):

  • 原子性(Atomicity):事务中的所有操作要么全部完成,要么全部不完成。

  • 一致性(Consistency):事务必须使数据库从一个一致性状态转换到另一个一致性状态。

  • 隔离性(Isolation):一个事务的执行不应受到其他事务的干扰。

  • 持久性(Durability):一旦事务提交,数据就应该是永久性的,不会丢失。

在 MySQL 数据库中,事务主要依赖于 InnoDB 存储引擎,因为 InnoDB 支持事务,而 MyISAM 等其他存储引擎则不支持。


2. mysqli::begin_transaction 函数的基本用法

在 PHP 中,mysqli::begin_transaction 函数用于显式地启动一个事务。调用该函数后,MySQL 会开始一个事务,而不再立即提交或者回滚数据,直到开发者明确调用 commit() 或者 rollback()

函数签名:
<span><span>mysqli::</span><span><span class="hljs-title function_ invoke__">begin_transaction</span></span><span>();
</span></span>

该函数没有参数,并且返回值为 void,即没有返回结果。它主要用于启动事务,之后你可以执行一系列的数据库操作。

使用流程:
  1. 连接数据库:首先,需要通过 mysqli_connect 或者面向对象方式建立数据库连接。

  2. 启动事务:调用 begin_transaction 来开始事务。

  3. 执行 SQL 操作:在事务中执行一系列 SQL 操作,比如插入、更新或者删除数据。

  4. 提交或回滚:根据执行结果,决定是否提交事务(commit)或者回滚事务(rollback)。

示例代码:
<span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-comment">// 创建连接</span></span><span>
</span><span><span class="hljs-variable">$mysqli</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">mysqli</span></span><span>(</span><span><span class="hljs-string">"localhost"</span></span><span>, </span><span><span class="hljs-string">"user"</span></span><span>, </span><span><span class="hljs-string">"password"</span></span><span>, </span><span><span class="hljs-string">"database"</span></span><span>);

</span><span><span class="hljs-comment">// 检查连接</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;connect_error) {
    </span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"连接失败: "</span></span><span> . </span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;connect_error);
}

</span><span><span class="hljs-comment">// 开始事务</span></span><span>
</span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">begin_transaction</span></span><span>();

</span><span><span class="hljs-keyword">try</span></span><span> {
    </span><span><span class="hljs-comment">// 执行 SQL 操作</span></span><span>
    </span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">query</span></span><span>(</span><span><span class="hljs-string">"INSERT INTO users (name, email) VALUES ('Alice', '[email protected]')"</span></span><span>);
    </span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">query</span></span><span>(</span><span><span class="hljs-string">"UPDATE users SET email = '[email protected]' WHERE name = 'Bob'"</span></span><span>);
    
    </span><span><span class="hljs-comment">// 如果没有错误,提交事务</span></span><span>
    </span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">commit</span></span><span>();
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"事务提交成功!"</span></span><span>;
} </span><span><span class="hljs-keyword">catch</span></span><span> (</span><span><span class="hljs-built_in">Exception</span></span><span> </span><span><span class="hljs-variable">$e</span></span><span>) {
    </span><span><span class="hljs-comment">// 如果发生错误,回滚事务</span></span><span>
    </span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">rollback</span></span><span>();
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"事务回滚: "</span></span><span> . </span><span><span class="hljs-variable">$e</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">getMessage</span></span><span>();
}

</span><span><span class="hljs-comment">// 关闭连接</span></span><span>
</span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

3. 事务中的错误处理

在使用事务时,错误处理非常关键。我们通常通过 try-catch 语句来捕获异常,并在发生错误时回滚事务。这样可以保证即使中途某个操作失败,之前的所有操作也会被撤销,保持数据库的一致性。

在上面的代码中,假设在执行 SQL 操作时发生了错误(例如数据库约束冲突),那么 catch 块会捕获这个错误,并通过 $mysqli->rollback() 回滚所有的数据库操作。


4. 事务的提交与回滚

  • 提交事务(commit):当事务中的所有操作都执行成功时,可以调用 commit() 方法来提交事务,意味着所有的修改都会永久保存在数据库中。

  • 回滚事务(rollback):如果在事务中发生了错误,调用 rollback() 方法可以撤销之前执行的所有 SQL 操作,恢复数据库到事务开始之前的状态。

提交和回滚是事务控制的关键,决定了事务的最终结果。

示例:
<span><span><span class="hljs-comment">// 提交事务</span></span><span>
</span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">commit</span></span><span>();

</span><span><span class="hljs-comment">// 回滚事务</span></span><span>
</span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">rollback</span></span><span>();
</span></span>

5. 注意事项

  • 自动提交模式:MySQL 默认启用自动提交模式,即每条 SQL 语句执行后会立即提交。如果你想要使用事务,你需要手动禁用自动提交模式。可以通过 mysqli->autocommit(FALSE) 禁用自动提交。

    示例:

    <span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">autocommit</span></span><span>(</span><span><span class="hljs-literal">FALSE</span></span><span>);  </span><span><span class="hljs-comment">// 禁用自动提交</span></span><span>
    </span></span>
  • 事务的嵌套:MySQL 不支持真正的嵌套事务。如果你在一个事务中启动了另一个事务,内部事务的提交或回滚不会影响外部事务。