在各類管理系統中,事務處理是保證數據一致性的基石。以人員管理系統為例:刪除一名人員時,需同步刪除基本資料、信箱、文章等多表關聯數據。這組 SQL 語句構成一個不可分割的邏輯單元——事務。若無事務保護,執行過程中發生錯誤(如僅執行了第一條刪除語句),將導致數據不一致,後果嚴重。而有了事務,只需在出錯時執行 ROLLBACK 即可撤銷所有操作,確保數據完整性。在商務級應用中,事務處理是必須考慮的核心需求。
BEGIN; -- 開始事務
-- SQL 操作序列
COMMIT; -- 提交事務
-- 或
ROLLBACK; -- 回滾事務
此方式僅將當前語句塊作為一個事務,控制精準,推薦生產環境使用。
SET AUTOCOMMIT = 0; -- 禁用自動提交
-- 後續所有 SQL 均屬於同一事務,直到 COMMIT 或 ROLLBACK
SET AUTOCOMMIT = 1; -- 重新啟用自動提交
注意:設置 AUTOCOMMIT=0 後,該會話所有後續操作均屬於同一事務,直到顯式結束,同時會隱式開啟新事務。靈活性較差,不推薦常規使用。
只有 InnoDB 和 BDB 表類型支持事務處理! 其他類型(如 MyISAM)不支持,切記切記。
mysql> USE test;
mysql> CREATE TABLE `dbtest` (id INT(4)) ENGINE=INNODB;
mysql> BEGIN;
mysql> INSERT INTO dbtest VALUES(5);
mysql> INSERT INTO dbtest VALUES(6);
mysql> COMMIT;
mysql> SELECT * FROM dbtest; -- 顯示 5, 6
mysql> BEGIN;
mysql> INSERT INTO dbtest VALUES(7);
mysql> ROLLBACK;
mysql> SELECT * FROM dbtest; -- 仍顯示 5, 6,7 已回滾
function Tran($sqlArray) {
$judge = 1;
mysql_query('BEGIN');
foreach ($sqlArray as $sql) {
if (!mysql_query($sql)) $judge = 0;
}
if ($judge == 0) {
mysql_query('ROLLBACK');
return false;
} else {
mysql_query('COMMIT');
return true;
}
}
另一種寫法(注意拼寫 ROLLBACK,原文有誤寫為 ROOLBACK):
mysql_query("SET AUTOCOMMIT=0");
mysql_query("BEGIN");
if (!mysql_query("INSERT ...")) mysql_query("ROLLBACK");
if (!mysql_query("INSERT ...")) mysql_query("ROLLBACK");
mysql_query("COMMIT");
MySQL 事務處理基於 InnoDB 引擎,遵循 ACID 原則。生產環境強烈建議使用 BEGIN/COMMIT/ROLLBACK 顯式控制方式,確保數據操作的原子性與一致性。理解事務隔離級別與鎖機制,對高併發系統設計至關重要。