當前位置: 首頁> 最新文章列表> 如何正確使用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 開發者更直觀、可控地管理事務流程。在實際項目中,務必在執行多條邏輯相關的數據庫操作時使用事務,並做好錯誤處理與回滾邏輯,從而保證數據的一致性與安全性。