文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (美國信紙) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  ...  /  autocommit、Commit 和 Rollback

17.7.2.2 autocommit、Commit 和 Rollback

InnoDB 中,所有使用者活動都發生在交易內。如果啟用 autocommit 模式,則每個 SQL 陳述式本身都會形成一個單一交易。依預設,MySQL 會為每個新連線啟動 autocommit 啟用的工作階段,因此如果該陳述式未傳回錯誤,則 MySQL 會在每個 SQL 陳述式之後執行 commit。如果陳述式傳回錯誤,則 commit 或 rollback 行為取決於錯誤。請參閱第 17.20.5 節「InnoDB 錯誤處理」

已啟用 autocommit 的工作階段可以透過以明確的 START TRANSACTIONBEGIN 陳述式開始,並以 COMMITROLLBACK 陳述式結束,來執行多個陳述式的交易。請參閱第 15.3.1 節「START TRANSACTION、COMMIT 和 ROLLBACK 陳述式」

如果工作階段中以 SET autocommit = 0 停用了 autocommit 模式,則工作階段一律會開啟一個交易。COMMITROLLBACK 陳述式會結束目前的交易並開始一個新的交易。

如果已停用 autocommit 的工作階段在未明確提交最終交易的情況下結束,則 MySQL 會回溯該交易。

某些陳述式會隱含地結束交易,如同在執行陳述式之前執行了 COMMIT 一樣。如需詳細資訊,請參閱第 15.3.3 節「導致隱含 Commit 的陳述式」

一個 COMMIT 代表目前交易中做的變更將永久生效,並對其他會話可見。另一方面,ROLLBACK 陳述式會取消目前交易中做的所有修改。COMMITROLLBACK 都會釋放目前交易期間設定的所有 InnoDB 鎖定。

使用交易分組 DML 操作

預設情況下,與 MySQL 伺服器的連線會啟用自動提交模式,該模式會在您執行時自動提交每個 SQL 陳述式。如果您有其他資料庫系統的使用經驗,這種操作模式可能不太熟悉,在其他資料庫系統中,標準做法是發出一系列的 DML 陳述式,然後一起提交或回滾它們。

若要使用多個陳述式的交易,請使用 SQL 陳述式 SET autocommit = 0 關閉自動提交,並根據情況使用 COMMITROLLBACK 結束每個交易。若要保持自動提交開啟,請使用 START TRANSACTION 開始每個交易,並使用 COMMITROLLBACK 結束。以下範例顯示兩個交易。第一個已提交;第二個已回滾。

$> mysql test
mysql> CREATE TABLE customer (a INT, b CHAR (20), INDEX (a));
Query OK, 0 rows affected (0.00 sec)
mysql> -- Do a transaction with autocommit turned on.
mysql> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO customer VALUES (10, 'Heikki');
Query OK, 1 row affected (0.00 sec)
mysql> COMMIT;
Query OK, 0 rows affected (0.00 sec)
mysql> -- Do another transaction with autocommit turned off.
mysql> SET autocommit=0;
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO customer VALUES (15, 'John');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO customer VALUES (20, 'Paul');
Query OK, 1 row affected (0.00 sec)
mysql> DELETE FROM customer WHERE b = 'Heikki';
Query OK, 1 row affected (0.00 sec)
mysql> -- Now we undo those last 2 inserts and the delete.
mysql> ROLLBACK;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT * FROM customer;
+------+--------+
| a    | b      |
+------+--------+
|   10 | Heikki |
+------+--------+
1 row in set (0.00 sec)
mysql>
用戶端語言中的交易

在 PHP、Perl DBI、JDBC、ODBC 或 MySQL 的標準 C 呼叫介面等 API 中,您可以像其他 SQL 陳述式(例如 SELECTINSERT)一樣,以字串形式將交易控制陳述式(例如 COMMIT)傳送至 MySQL 伺服器。某些 API 也提供單獨的特殊交易提交和回滾函數或方法。