< DOCTYPE html PUBLIC -WCDTD XHTML StrictEN httpwwwworgTRxhtmlDTDxhtml-strictdtd>
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的效果一樣。請參見15.2.10.4節,“一緻的非鎖定讀”。
開始一項事務會造成一個隐含的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,用于連接配接。
<a href="http://www.cnblogs.com/tag/%E6%95%B0%E6%8D%AE%E5%BA%93%E6%8A%80%E6%9C%AF/feeds">#資料庫技術</a>
本文轉自 netcorner 部落格園部落格,原文連結: http://www.cnblogs.com/netcorner/archive/2011/09/30/2910986.html ,如需轉載請自行聯系原作者