在 InnoDB
中,所有使用者活動都發生在交易內。如果啟用 autocommit
模式,則每個 SQL 陳述式本身都會形成一個單一交易。依預設,MySQL 會為每個新連線啟動 autocommit
啟用的工作階段,因此如果該陳述式未傳回錯誤,則 MySQL 會在每個 SQL 陳述式之後執行 commit。如果陳述式傳回錯誤,則 commit 或 rollback 行為取決於錯誤。請參閱第 17.20.5 節「InnoDB 錯誤處理」。
已啟用 autocommit
的工作階段可以透過以明確的 START TRANSACTION
或 BEGIN
陳述式開始,並以 COMMIT
或 ROLLBACK
陳述式結束,來執行多個陳述式的交易。請參閱第 15.3.1 節「START TRANSACTION、COMMIT 和 ROLLBACK 陳述式」。
如果工作階段中以 SET autocommit = 0
停用了 autocommit
模式,則工作階段一律會開啟一個交易。COMMIT
或 ROLLBACK
陳述式會結束目前的交易並開始一個新的交易。
如果已停用 autocommit
的工作階段在未明確提交最終交易的情況下結束,則 MySQL 會回溯該交易。
某些陳述式會隱含地結束交易,如同在執行陳述式之前執行了 COMMIT
一樣。如需詳細資訊,請參閱第 15.3.3 節「導致隱含 Commit 的陳述式」。
一個 COMMIT
代表目前交易中做的變更將永久生效,並對其他會話可見。另一方面,ROLLBACK
陳述式會取消目前交易中做的所有修改。COMMIT
和 ROLLBACK
都會釋放目前交易期間設定的所有 InnoDB
鎖定。
預設情況下,與 MySQL 伺服器的連線會啟用自動提交模式,該模式會在您執行時自動提交每個 SQL 陳述式。如果您有其他資料庫系統的使用經驗,這種操作模式可能不太熟悉,在其他資料庫系統中,標準做法是發出一系列的 DML 陳述式,然後一起提交或回滾它們。
若要使用多個陳述式的交易,請使用 SQL 陳述式 SET autocommit = 0
關閉自動提交,並根據情況使用 COMMIT
或 ROLLBACK
結束每個交易。若要保持自動提交開啟,請使用 START TRANSACTION
開始每個交易,並使用 COMMIT
或 ROLLBACK
結束。以下範例顯示兩個交易。第一個已提交;第二個已回滾。
$> 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 陳述式(例如 SELECT
或 INSERT
)一樣,以字串形式將交易控制陳述式(例如 COMMIT
)傳送至 MySQL 伺服器。某些 API 也提供單獨的特殊交易提交和回滾函數或方法。