文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  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 的工作階段在未明確 commit 最後一個交易的情況下結束,則 MySQL 會 rollback 該交易。

某些語句會隱含地結束交易,就像您在執行該語句之前執行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 中,您可以將交易控制陳述式(例如 COMMIT)作為字串發送到 MySQL 伺服器,就像其他 SQL 陳述式(例如 SELECTINSERT)一樣。有些 API 也提供單獨的特殊交易提交和回滾函式或方法。