您好,登錄后才能下訂單哦!
這篇文章主要介紹“MYSQL事務(wù)以及隔離級(jí)的概念”,在日常操作中,相信很多人在MYSQL事務(wù)以及隔離級(jí)的概念問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”MYSQL事務(wù)以及隔離級(jí)的概念”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!
事務(wù)的概念
事務(wù)是一組原子性的SQL查詢語(yǔ)句,也可以被看做一個(gè)工作單元。如果數(shù)據(jù)庫(kù)引擎能夠成功地對(duì)數(shù)據(jù)庫(kù)應(yīng)用所有的查詢語(yǔ) 句,它就會(huì)執(zhí)行所有查詢,如果任何一條查詢語(yǔ)句因?yàn)楸罎⒒蚱渌蚨鵁o(wú)法執(zhí)行,那么所有的語(yǔ)句就都不會(huì)執(zhí)行。也就是說(shuō),事務(wù)內(nèi)的語(yǔ)句要么全部執(zhí)行,要么一 句也不執(zhí)行。
例:將b表中符合條件的記錄搬移到a表中(相似語(yǔ)句已在命令提示行中測(cè)試)
1 2 3 4 5 | start transaction ;//用start transaction 語(yǔ)句開(kāi)始一個(gè)事務(wù) insert into a select from b where ...;//將b表中符合條件的行記錄插入a表 delete from b where ...;//將b表中符合條件的行記錄刪除 commit ; / rollback ; // commit 語(yǔ)句提交整個(gè)事務(wù),永久地修改數(shù)據(jù), rollback 語(yǔ)句回滾整個(gè)事務(wù),取消已做的修改 //如果插入操作失敗,那么刪除操作將不執(zhí)行 |
ACID測(cè)試
ACID:原子性(atomicity)、一致性(consistency)、隔離性(isolation)、持久性(durability)。一個(gè)有效的事務(wù)處理系統(tǒng)必須滿足相關(guān)標(biāo)準(zhǔn)。
a.原子性:一個(gè)事務(wù)必須被視為一個(gè)單獨(dú)的內(nèi)部“不可分”的工作單元,以確保整個(gè)事務(wù)要么全部執(zhí)行,要么全部回滾。當(dāng)一個(gè)事務(wù)具有原子性時(shí),該事務(wù)絕對(duì)不會(huì)被部分執(zhí)行,要么完全執(zhí)行,要么根本不執(zhí)行。
b.一致性:數(shù)據(jù)庫(kù)總是從一種一致性狀態(tài)轉(zhuǎn)換到另一種一致性狀態(tài)。在上述例子中,一致性確保了,即使插入或者刪除操作失敗了,數(shù)據(jù)庫(kù)也不會(huì)多出或者丟失記錄。因?yàn)樽罱K事務(wù)根本沒(méi)有被提交,任何事務(wù)處理過(guò)程中所做的數(shù)據(jù)改變,也不會(huì)影響到數(shù)據(jù)庫(kù)的內(nèi)容。
c.隔離性:某個(gè)事務(wù)的結(jié)果只有在完成之后才對(duì)其他事務(wù)可見(jiàn)。在上述例子中,當(dāng)數(shù)據(jù)庫(kù)執(zhí)行完insert語(yǔ)句,還未執(zhí)行delete語(yǔ)句時(shí),如果此時(shí)另一個(gè)客戶端對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)也同時(shí)運(yùn)行,它將仍視符合條件的記錄在b表中。
d.持久性:一旦一個(gè)事務(wù)提交,事務(wù)所做的數(shù)據(jù)改變將是永久的。
這種事務(wù)處理中的額外安全措施,導(dǎo)致數(shù)據(jù)庫(kù)服務(wù)器要完成更多的額外工作。通常,一個(gè)支持ACID特性的數(shù)據(jù)庫(kù),相對(duì)于不支持這種特性的數(shù)據(jù)庫(kù),需要更強(qiáng) 的CPU處理能力,更大的內(nèi)存和更多的磁盤空間。這正是選用MYSQL存儲(chǔ)引擎架構(gòu)的有利之處。用戶可以根據(jù)應(yīng)用是否需要事務(wù)處理,選擇相應(yīng)的存儲(chǔ)引擎。 如果對(duì)于某些類型的數(shù)據(jù)查詢,用戶不需要真正的事務(wù)處理,他可以選擇一個(gè)非事務(wù)處理型的存儲(chǔ)引擎來(lái)實(shí)現(xiàn)查詢,以獲得更高的處理性能。(我們的數(shù)據(jù)庫(kù)選擇的 存儲(chǔ)引擎是innoDB,支持事務(wù)處理,而mysql默認(rèn)的存儲(chǔ)引擎是MyISAM引擎,不支持事務(wù))
隔離級(jí)
SQL標(biāo)準(zhǔn)定義了4類隔離級(jí),包括了一些具體規(guī)則,用來(lái)限定事務(wù)內(nèi)外的哪些改變時(shí)可見(jiàn)的,哪些是不可見(jiàn)的。低級(jí)別的隔離級(jí)一般支持更高的并發(fā)處理,并擁有更低的系統(tǒng)開(kāi)銷。
READ UNCOMMITTED(讀取未提交內(nèi)容)
在READ UNCOMMITTED隔離級(jí),所有事務(wù)都可以“看到”未提交事務(wù)的執(zhí)行結(jié)果。在這種級(jí)別上,可能會(huì)產(chǎn)生很多問(wèn)題。本隔離級(jí)很少用于實(shí)際應(yīng)用,因?yàn)樗男?能也不比其他級(jí)別好多少,而別的級(jí)別還有其他更多的優(yōu)點(diǎn)。讀取未提交數(shù)據(jù),也被稱之為“臟讀(Dirty Read)”
READ COMMITTED(讀取提交內(nèi)容)
大多數(shù)數(shù)據(jù)庫(kù)系統(tǒng)的默認(rèn)隔離級(jí)是READ COMMITTED(但這不是MYSQL默認(rèn)的)。它滿足了隔離的早先簡(jiǎn)單定義:一個(gè)事務(wù)在開(kāi)始時(shí),只能“看見(jiàn)”已經(jīng)提交事務(wù)所做的改變,一個(gè)事務(wù)從開(kāi)始 到提交前,所做的任何數(shù)據(jù)改變都是不可見(jiàn)的,除非已經(jīng)提交。這種隔離級(jí)別也支持所謂的“不可重復(fù)讀(Nonrepeatable Read)”。這意味著用戶運(yùn)行同一語(yǔ)句兩次,看到的結(jié)果是不同的。
REPEATABLE READ(可重讀)
REPEATABLE READ 隔離級(jí)解決了READ UNCOMMITTED隔離級(jí)導(dǎo)致的問(wèn)題。它確保同一事務(wù)的多個(gè)實(shí)例在并發(fā)讀取數(shù)據(jù)時(shí),會(huì)“看到相同的”數(shù)據(jù)行。不過(guò)理論上,這會(huì)導(dǎo)致另一個(gè)棘手問(wèn)題:幻 讀(Phantom Read)。簡(jiǎn)單來(lái)說(shuō),幻讀指當(dāng)用戶讀取某一范圍的數(shù)據(jù)行時(shí),另一個(gè)事務(wù)又在該范圍內(nèi)插入了新行,當(dāng)用戶再讀取該范圍的數(shù)據(jù)行時(shí),另一個(gè)事務(wù)又在該范圍內(nèi) 插入了新行,當(dāng)用戶再讀取該范圍的數(shù)據(jù)行時(shí),會(huì)發(fā)現(xiàn)有新的“幻影”行。InnoDB和Falcon存儲(chǔ)引擎通過(guò)多版本并發(fā)控制機(jī)制解決了幻讀問(wèn)題。 REPEATABLE READ 是MYSQL的默認(rèn)事務(wù)隔離級(jí)。InnoDB和Falcon存儲(chǔ)引擎都遵循這種設(shè)置。
SERIALIZABLE(可串行化)
SERIALIZABLE是最高級(jí)別的隔離級(jí),它通過(guò)強(qiáng)制事務(wù)排斥,使之不可能相互沖突,從而解決幻讀問(wèn)題。簡(jiǎn)言之,SERIALIZABLE是在每個(gè)讀的數(shù)據(jù)行上加鎖。在這個(gè)級(jí)別,可能導(dǎo)致大量的超時(shí)現(xiàn)象和鎖競(jìng)爭(zhēng)現(xiàn)象。很少看到有用戶選擇這種隔離級(jí)。
注:不可重復(fù)讀與幻讀:不可重復(fù)讀的重點(diǎn)是修改(同樣的查詢條件,你讀取過(guò)的數(shù)據(jù),再次讀取出來(lái)發(fā)現(xiàn)值不一樣了);幻讀的重點(diǎn)在于新增或者刪除(同樣的查詢條件,第1次和第2次讀出來(lái)的記錄數(shù)不一樣)
查看InnoDB系統(tǒng)級(jí)別的事務(wù)隔離級(jí)別:
1 | mysql> SELECT @@ global .tx_isolation; |
查看InnoDB會(huì)話級(jí)別的事務(wù)隔離級(jí)別:
1 | mysql> SELECT @@tx_isolation; |
MySQL中的事務(wù)
AUTOCOMMIT(自動(dòng)提交)
MySQL默認(rèn)操作模式是AUTOCOMMIT模式。這意味著除非顯示地開(kāi)始一個(gè)事務(wù),否則它將把每個(gè)查詢視為一個(gè)單獨(dú)事務(wù)自動(dòng)執(zhí)行。在當(dāng)前連接中,可以通過(guò)變量設(shè)置,啟用和禁用AUTOCOMMIT模式。
1 2 | mysql> SHOW VARIABLES LIKE 'AUTOCOMMIT' ; //高版本的mysql支持 mysql> select @@autocommit; //mysql5.0支持 |
如果設(shè)置AUTOCOMMIT=0,用戶將一直處于某個(gè)事務(wù)中,直到用戶執(zhí)行一條COMMIT或ROLLBACK語(yǔ)句,之后,MYSQL將立即開(kāi)始一個(gè)新事務(wù)。
在事務(wù)中混合使用存儲(chǔ)引擎
在一個(gè)事務(wù)中,如果混合使用事務(wù)性表和非事務(wù)性表,假如事務(wù)處理一切順利,那么結(jié)果也會(huì)正常。但是,如果事務(wù)須回滾,那么在非事務(wù)性表上做的修改將無(wú)法取消。這將導(dǎo)致數(shù)據(jù)庫(kù)處于數(shù)據(jù)不一致的狀態(tài),在這種狀態(tài)下,很難對(duì)數(shù)據(jù)進(jìn)行恢復(fù),并且事務(wù)會(huì)變得懸而未決。
隱式和顯式鎖定
InnoDB使用二相鎖定協(xié)議(Two-Phase Locking Protocol兩段鎖協(xié)議)。一個(gè)事務(wù)在執(zhí)行過(guò)程中的任何時(shí)候,都可以獲得鎖,但只有在執(zhí)行COMMIT或ROLLBACK語(yǔ)句后,才可以釋放這些鎖。 它會(huì)同時(shí)釋放掉所有鎖。以上描述的鎖定機(jī)制都是隱式鎖定。InnoDB會(huì)根據(jù)用戶的隔離級(jí)別,自動(dòng)處理鎖定。不過(guò)InnoDB也支持顯示鎖定。
到此,關(guān)于“MYSQL事務(wù)以及隔離級(jí)的概念”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。