1. 程式人生 > 資料庫 >MySQL的SQL語句 -事務性語句和鎖定語句(2)- 導致隱式提交的語句

MySQL的SQL語句 -事務性語句和鎖定語句(2)- 導致隱式提交的語句

導致隱式提交的語句

本節中列出的語句(以及它們的任何同義詞)隱式結束當前會話中活動的任何事務,就像在執行語句之前執行了 COMMIT 一樣。

大多數這些語句在執行後也會導致隱式提交。其目的是在自己的特殊事務中處理這樣的語句。事務控制和鎖定語句是例外:如果隱式提交發生在執行之前,另一個則不會在執行之後發生。

● 定義或修改資料庫物件的資料定義語言(DDL)語句。

ALTER EVENT, ALTER FUNCTION, ALTER PROCEDURE, ALTER SERVER, ALTER TABLE, ALTER VIEW, CREATE DATABASE, CREATE EVENT, CREATE FUNCTION, CREATE INDEX, CREATE PROCEDURE, CREATE ROLE, CREATE SERVER, CREATE SPATIAL REFERENCE SYSTEM, CREATE TABLE, CREATE TRIGGER, CREATE VIEW, DROP DATABASE, DROP EVENT, DROP FUNCTION, DROP INDEX, DROP PROCEDURE, DROP ROLE, DROP SERVER, DROP SPATIAL REFERENCE SYSTEM, DROP TABLE, DROP TRIGGER, DROP VIEW, INSTALL PLUGIN, RENAME TABLE, TRUNCATE TABLE, UNINSTALL PLUGIN。

如果使用了 TEMPORARY 關鍵字,CREATE TABLE 和 DROP TABLE 語句不會提交事務。(這不適用於臨時表上的其他操作,例如 ALTER TABLE 和 CREATE INDEX,它們確實會導致提交)但是,雖然沒有隱式提交,但是語句也不能回滾,這意味著使用這些語句會導致違反事務原子性。例如,如果使用 CREATE TEMPORARY TABLE 語句,然後回滾事務,該表仍然存在。

InnoDB 中的 CREATE TABLE 語句作為單個事務處理。這意味著使用者的 ROLLBACK 語句不會撤消使用者在該事務期間所執行的 CREATE TABLE 語句。

建立非臨時表時,CREATE TABLE ... SELECT 將在執行語句之前和之後執行隱式提交。(CREATE TEMPORARY TABLE ... SELECT 語句沒有提交。)

● 隱式使用或修改 mysql 資料庫中的表的語句。ALTER USER, CREATE USER, DROP USER, GRANT, RENAME USER, REVOKE, SET PASSWORD。

● 事務控制和鎖定語句。BEGIN, LOCK TABLES, SET autocommit = 1(如果值不是1),START TRANSACTION, UNLOCK TABLES。

只有當某些表當前已用 LOCK TABLES 鎖定以獲取非事務性表鎖時,UNLOCK TABLES 才會提交事務。對於帶有 UNLOCK TABLES 的 FLUSH TABLES WITH READ LOCK 語句,不會發生提交,因為該語句不獲取表級鎖。

事務不能巢狀。這是在執行 START TRANSACTION 語句或其同義詞時,對任何當前事務執行隱式提交的結果。

當事務處於活動狀態時,不能在 XA 事務中使用導致隱式提交的語句。

BEGIN 語句不同於使用 BEGIN 關鍵字來啟動的 BEGIN ... END 複合語句。後者不會導致隱式提交。

● 資料載入語句。LOAD DATA。LOAD DATA 只會引起使用 NDB 儲存引擎的表隱式提交。

● 管理語句。ANALYZE TABLE, CACHE INDEX, CHECK TABLE, FLUSH, LOAD INDEX INTO CACHE, OPTIMIZE TABLE, REPAIR TABLE, RESET (不是 RESET PERSIST)。

● 複製控制語句。START REPLICA | SLAVE, STOP REPLICA | SLAVE, RESET REPLICA | SLAVE, CHANGE MASTER TO。

官方網址: