mysql 鎖表鎖行語句分享(MySQL事務(wù)處理)
更新時(shí)間:2011年09月16日 16:44:58 作者:
下面這個(gè)語句是鎖定一行數(shù)據(jù),開始讀取,一直到刪除后都不會(huì)有第二個(gè)人也讀到這條數(shù)據(jù)
復(fù)制代碼 代碼如下:
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語法
復(fù)制代碼 代碼如下:
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語句可以開始一項(xiàng)新的事務(wù)。COMMIT可以提交當(dāng)前事務(wù),是變更成為永久變更。ROLLBACK可以 回滾當(dāng)前事務(wù),取消其變更。SET AUTOCOMMIT語句可以禁用或啟用默認(rèn)的autocommit模式,用于當(dāng)前連接。
自選的WORK關(guān)鍵詞被支持,用于COMMIT和RELEASE,與CHAIN和RELEASE子句。CHAIN和RELEASE可以被用于對事務(wù)完成進(jìn)行附加控制。Completion_type系統(tǒng)變量的值決定了默認(rèn)完成的性質(zhì)。
AND CHAIN子句會(huì)在當(dāng)前事務(wù)結(jié)束時(shí),立刻啟動(dòng)一個(gè)新事務(wù),并且新事務(wù)與剛結(jié)束的事務(wù)有相同的隔離等級。RELEASE子句在終止了當(dāng)前事務(wù)后,會(huì)讓服務(wù)器斷開與當(dāng)前客戶端的連接。包含NO關(guān)鍵詞可以抑制CHAIN或RELEASE完成。如果completion_type系統(tǒng)變量被設(shè)置為一定的值,使連鎖或釋放完成可以默認(rèn)進(jìn)行,此時(shí)NO關(guān)鍵詞有用。
默認(rèn)情況下,MySQL采用autocommit模式運(yùn)行。這意味著,當(dāng)您執(zhí)行一個(gè)用于更新(修改)表的語句之后,MySQL立刻把更新存儲到磁盤中。
如果您正在使用一個(gè)事務(wù)安全型的存儲引擎(如InnoDB, BDB或NDB簇),則您可以使用以下語句禁用autocommit模式:
SET AUTOCOMMIT=0;
通過把AUTOCOMMIT變量設(shè)置為零,禁用autocommit模式之后,您必須使用COMMIT把變更存儲到磁盤中,或著如果您想要忽略從事務(wù)開始進(jìn)行以來做出的變更,使用ROLLBACK。
如果您想要對于一個(gè)單一系列的語句禁用autocommit模式,則您可以使用START TRANSACTION語句:
復(fù)制代碼 代碼如下:
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結(jié)束事務(wù)為止。然后autocommit模式恢復(fù)到原來的狀態(tài)。
BEGIN和BEGIN WORK被作為START TRANSACTION的別名受到支持,用于對事務(wù)進(jìn)行初始化。START TRANSACTION是標(biāo)準(zhǔn)的SQL語法,并且是啟動(dòng)一個(gè)ad-hoc事務(wù)的推薦方法。BEGIN語句與BEGIN關(guān)鍵詞的使用不同。BEGIN關(guān)鍵詞可以啟動(dòng)一個(gè)BEGIN...END復(fù)合語句。后者不會(huì)開始一項(xiàng)事務(wù)。
您也可以按照如下方法開始一項(xiàng)事務(wù):
START TRANSACTION WITH CONSISTENT SNAPSHOT;
WITH CONSISTENT SNAPSHOT子句用于啟動(dòng)一個(gè)一致的讀取,用于具有此類功能的存儲引擎。目前,該子句只適用于InnoDB。該子句的效果與發(fā)布一個(gè)START TRANSACTION,后面跟一個(gè)來自任何InnoDB表的SELECT的效果一樣。請參見15.2.10.4節(jié),“一致的非鎖定讀”。
開始一項(xiàng)事務(wù)會(huì)造成一個(gè)隱含的UNLOCK TABLES被執(zhí)行。
為了獲得最好的結(jié)果,事務(wù)應(yīng)只使用由單一事務(wù)存儲引擎管理的表執(zhí)行。否則,會(huì)出現(xiàn)以下問題:
如果您使用的表來自多個(gè)事務(wù)安全型存儲引擎(例如InnoDB和BDB),并且事務(wù)隔離等級不是SERIALIZABLE,則有可能當(dāng)一個(gè)事務(wù)提交時(shí),其它正在進(jìn)行中的、使用同樣的表的事務(wù)將只會(huì)發(fā)生由第一個(gè)事務(wù)產(chǎn)生的變更。也就是,用混合引擎不能保證事務(wù)的原子性,并會(huì)造成不一致。(如果混合引擎事務(wù)不經(jīng)常有,則您可以根據(jù)需要使用SET TRANSACTION ISOLATION LEVEL把隔離等級設(shè)置到SERIALIZABLE。)
如果您在事務(wù)中使用非事務(wù)安全型表,則對這些表的任何變更被立刻存儲,不論autocommit模式的狀態(tài)如何。
如果您在更新了事務(wù)中一個(gè)事務(wù)表之后,發(fā)布一個(gè)ROLLBACK語句,則會(huì)出現(xiàn)一個(gè)ER_WARNING_NOT_COMPLETE_ROLLBACK警告。對事務(wù)安全型表的變更被 回滾,但是對非事務(wù)安全型表沒有變更。
每個(gè)事務(wù)被存儲在一個(gè)組塊中的二進(jìn)制日志中,在COMMIT之上。被回滾的事務(wù)不被計(jì)入日志。(例外情況:對非事務(wù)表的更改不會(huì)被 回滾。如果一個(gè)被回滾的事務(wù)包括對非事務(wù)表的更改,則整個(gè)事務(wù)使用一個(gè)在末端的ROLLBACK語句計(jì)入日志,以確保對這些表的更改進(jìn)行復(fù)制。)
您可以使用SET TRANSACTION ISOLATION LEVEL更改事務(wù)的隔離等級。
回滾可以慢速運(yùn)行。在用戶沒有明確要求時(shí),也可以進(jìn)行回滾(例如,當(dāng)錯(cuò)誤發(fā)生時(shí))。因此,在明確地和隱含的(ROLLBACK SQL命令)回滾時(shí),SHOW PROCESSLIST會(huì)在Stage列中顯示Rolling back,用于連接。
相關(guān)文章
關(guān)于 MySQL 嵌套子查詢中無法關(guān)聯(lián)主表字段問題的解決方法
這篇文章主要介紹了關(guān)于 MySQL 嵌套子查詢中,無法關(guān)聯(lián)主表字段問題的折中解決方法,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-12-12修改MySQL8.0 默認(rèn)的數(shù)據(jù)目錄(快捷操作無配置)
這篇文章主要介紹了修改MySQL8.0 默認(rèn)的數(shù)據(jù)目錄(快捷操作無配置),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11詳解遠(yuǎn)程連接Mysql數(shù)據(jù)庫的問題(ERROR 2003 (HY000))
本篇文章是對遠(yuǎn)程連接Mysql數(shù)據(jù)庫的問題進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-065招帶你輕松優(yōu)化MySQL count(*)查詢性能
最近在公司優(yōu)化了幾個(gè)慢查詢接口的性能,總結(jié)了一些心得體會(huì)拿出來跟大家一起分享一下,文中的示例代碼講解詳細(xì),希望對大家會(huì)有所幫助2022-11-11mysql 8.0.15 winx64壓縮包安裝配置方法圖文教程
這篇文章主要為大家詳細(xì)介紹了mysql 8.0.15 winx64壓縮包安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-05-05MySQL提升大量數(shù)據(jù)查詢效率的優(yōu)化神器
這篇文章主要介紹了MySQL提升大量數(shù)據(jù)查詢效率的優(yōu)化神器,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-07-07