当前位置: 首页> 最新文章列表> 如何正确使用 mysqli::begin_transaction 来实现数据库事务控制?

如何正确使用 mysqli::begin_transaction 来实现数据库事务控制?

gitbox 2025-08-21

<span><span><span class="hljs-meta"><?php</span></span><span> </span><span><span class="hljs-comment">// 本段是与文章内容无关的部分</span></span><span> </span><span><span class="hljs-comment">// 例如可以是作者信息、版权声明或加载某些配置</span></span><span> </span><span><span class="hljs-title function_ invoke__">date_default_timezone_set</span></span><span>(</span><span><span class="hljs-string">'Asia/Shanghai'</span></span><span>); </span><span><span class="hljs-variable">$author</span></span><span> = </span><span><span class="hljs-string">"数据库事务研究小组"</span></span><span>; </span><span><span class="hljs-variable">$publish_date</span></span><span> = </span><span><span class="hljs-title function_ invoke__">date</span></span><span>(</span><span><span class="hljs-string">'Y-m-d'</span></span><span>); </span><span><span class="hljs-meta">?></span></span><span> <hr> <h1>如何正确使用 mysqli::</span><span><span class="hljs-variable constant_">begin_transaction</span></span><span> 来实现数据库事务控制?</h1> <p>在使用 MySQL 数据库进行开发时,事务控制是保障数据一致性与完整性的重要手段。PHP 的 <code>mysqli

  • :可选,指定事务行为,如 MYSQLI_TRANS_START_READ_ONLYMYSQLI_TRANS_START_READ_WRITE
  • $name:可选,为事务指定一个名称(主要用于 XA 事务或某些高级场景)。

3. 基本示例


</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">'testdb'</span></span><span>);

</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$mysqli</span></span><span>->connect_errno) {
    </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>->connect_error);
}

</span><span><span class="hljs-keyword">try</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-title function_ invoke__">begin_transaction</span></span><span>();

    </span><span><span class="hljs-comment">// 执行多条相关的 SQL 语句</span></span><span>
    </span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">query</span></span><span>(</span><span><span class="hljs-string">"UPDATE accounts SET balance = balance - 100 WHERE id = 1"</span></span><span>);
    </span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">query</span></span><span>(</span><span><span class="hljs-string">"UPDATE accounts SET balance = balance + 100 WHERE id = 2"</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-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>-></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>-></span><span><span class="hljs-title function_ invoke__">getMessage</span></span><span>();
}

</span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">close</span></span><span>();

4. 注意事项

  • 确保 autocommit 已关闭(begin_transaction 会自动关闭当前会话的自动提交模式)。
  • 始终在 try...catch 中处理事务,确保发生错误时能回滚。
  • 在高并发环境中,合理使用锁与隔离级别(可通过 SET TRANSACTION ISOLATION LEVEL 设置)。

5. 总结

使用 mysqli::begin_transaction 能让 PHP 开发者更直观、可控地管理事务流程。在实际项目中,务必在执行多条逻辑相关的数据库操作时使用事务,并做好错误处理与回滚逻辑,从而保证数据的一致性与安全性。