mysql 鎖表鎖行語句分享(MySQL交易處理)

來源:互聯網
上載者:User

複製代碼 代碼如下:mysql_query("set autocommit=0");
$list_one = $db->fetch_first("select * from prizes where id = ".$id." FOR UPDATE");
$db->query("DELETE from prizes WHERE id =".$list_one['id']);
mysql_query("commit");

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,用於串連。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.