當前位置: 首頁> 最新文章列表> 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 不支持真正的嵌套事務。如果你在一個事務中啟動了另一個事務,內部事務的提交或回滾不會影響外部事務。