關於MySQL交易處理

來源:互聯網
上載者:User

START TRANSACTION, COMMIT和ROLLBACK文法

START TRANSACTION | BEGIN [WORK]
COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
SET AUTOCOMMIT = {0 | 1}

START TRANSACTION或BEGIN語句可以開始一項新的事務。COMMIT可以提交當前事務,使變更成為永久變更。ROLLBACK可以 復原當前事務,取消其變更。SET AUTOCOMMIT語句可以禁用或啟用預設的autocommit模式,用於當前串連。

自選的WORK關鍵詞被支援,用於COMMIT和RELEASE,與CHAIN和RELEASE子句。CHAIN和RELEASE可以被用於對事務完成進行附加控制。Completion_type系統變數的值決定了預設完成的性質。

AND CHAIN子句會在當前事務結束時,立刻啟動一個新事務,並且新事務與剛結束的事務有相同的隔離等級。RELEASE子句在終止了當前事務後,會讓伺服器 斷開與當前用戶端的串連。包含NO關鍵詞可以抑制CHAIN或RELEASE完成。如果completion_type系統變數被設定為一定的值,使連鎖 或釋放完成可以預設進行,此時NO關鍵詞有用。

預設情況下,MySQL採用autocommit模式運行。這意味著,當執行一個用於更新(修改)表的語句之後,MySQL立刻把更新儲存到磁碟中。

如果正在使用一個事務安全型的儲存引擎(如InnoDB, BDB或NDB簇),則可以使用以下語句禁用autocommit模式:

           SET AUTOCOMMIT=0;

通過把AUTOCOMMIT變數設定為零,禁用autocommit模式之後,必須使用COMMIT把變更儲存到磁碟中,或者如果想要忽略從事務開始進行以來做出的變更,使用ROLLBACK。

如果想要對於一個單一系列的語句禁用autocommit模式,則可以使用START TRANSACTION語句:

START TRANSACTION;
SELECT @A:=SUM(salary) FROM table1 WHERE type=1;
UPDATE table2 SET summary=@A WHERE type=1;
COMMIT;

使用START TRANSACTION,autocommit仍然被禁用,直到使用COMMIT或ROLLBACK結束事務為止。然後autocommit模式恢複到原來的狀態。

BEGIN和BEGIN WORK被作為START TRANSACTION的別名受到支援,用於對事務進行初始化。START TRANSACTION是標準的SQL文法,並且是啟動一個ad-hoc事務的推薦方法。BEGIN語句與BEGIN關鍵詞的使用不同。BEGIN關鍵詞 可以啟動一個BEGIN...END複合陳述式。後者不會開始一項事務。

也可以按照如下方法開始一項事務:

START TRANSACTION WITH CONSISTENT SNAPSHOT;

WITH CONSISTENT SNAPSHOT子句用於啟動一個一致的讀取,用於具有此類功能的儲存引擎。目前,該子句只適用於InnoDB。該子句的效果與發布一個START TRANSACTION,後面跟一個來自任何InnoDB表的SELECT的效果一樣。

開始一項事務會造成一個隱含的UNLOCK TABLES被執行。

為了獲得最好的結果,事務應只使用由單一事務儲存引擎管理的表執行。否則,會出現以下問題:

如果使用的表來自多個事務安全型儲存引擎(例如InnoDB和BDB),並且事務隔離等級不是SERIALIZABLE,則有可能當一個事務提交 時,其它進行中中的、使用同樣的表的事務將只會發生由第一個事務產生的變更。也就是,用混合引擎不能保證事務的原子性,並會造成不一致。(如果混合引擎 事務不經常有,則您可以根據需要使用SET TRANSACTION ISOLATION LEVEL把隔離等級設定到SERIALIZABLE。)

如果在事務中使用非事務安全型表,則對這些表的任何變更被立刻儲存,不論autocommit模式的狀態如何。

如果在更新了事務中一個事務表之後,發布一個ROLLBACK語句,則會出現一個ER_WARNING_NOT_COMPLETE_ROLLBACK警告。對事務安全型表的變更被 復原,但是對非事務安全型表沒有變更。

每個事務被儲存在一個組塊中的二進位日誌中,在COMMIT之上。被復原的事務不被計入日誌。(例外情況:對非事務表的更改不會被 復原。如果一個被復原的事務包括對非事務表的更改,則整個事務使用一個在末端的ROLLBACK語句計入日誌,以確保對這些表的更改進行複製。)

可以使用SET TRANSACTION ISOLATION LEVEL更改事務的隔離等級。

復原可以慢速運行。在使用者沒有明確要求時,也可以進行復原(例如,當錯誤發生時)。因此,在明確地和隱含的(ROLLBACK SQL命令)復原時,SHOW PROCESSLIST會在Stage列中顯示Rolling back,用於串連。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.