




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
MySQL中的事務(wù)事務(wù)的隔離級別MySQL作為多線程并發(fā)訪問的數(shù)據(jù)庫,其明顯的特點是資源可以被多個用戶共享訪問。當(dāng)多個用戶(多個事務(wù))同時訪問相同的數(shù)據(jù)庫資源時,如果各事務(wù)之間沒有采取必要的隔離措施,可能會出現(xiàn)以下幾種不確定的情況。一個事務(wù)讀取了某行數(shù)據(jù),而另外一個事務(wù)已經(jīng)更新了此行的數(shù)據(jù),但沒有及時提交,例如,事務(wù)A讀取了事務(wù)B更新的數(shù)據(jù),隨后事務(wù)B因為某些原因進行了回滾操作,那么事務(wù)A讀取到的數(shù)據(jù)就是臟數(shù)據(jù)。這種情況是非常危險的,很可能造成所有的操作都被回滾。(1)臟讀事務(wù)的隔離級別
不可重復(fù)讀是指一個事務(wù)的修改和提交造成另一個事務(wù)在同一范圍內(nèi)的兩次相同查詢的返回結(jié)果不同。例如,事務(wù)A需要多次讀取同一個數(shù)據(jù),在事務(wù)A還沒有結(jié)束時,事務(wù)B訪問并修改了該數(shù)據(jù),那么,事務(wù)A兩次讀取到的數(shù)據(jù)就可能不一致,因此稱為不可重復(fù)讀,即原始數(shù)據(jù)不能重復(fù)讀。(2)不可重復(fù)讀事務(wù)的隔離級別
幻讀是指一個線程中的事務(wù)讀取到了另外一個線程中提交的INSERT數(shù)據(jù)。例如,用戶A將數(shù)據(jù)庫中所有學(xué)生的成績從具體分?jǐn)?shù)改為ABCDE等級,但是用戶B此時插入了一條具體分?jǐn)?shù)的記錄,用戶A修改完成后發(fā)現(xiàn)還有一條記錄沒有改過來,就好像發(fā)生了幻覺一樣,因此稱這種情況為幻讀或者虛讀。(3)幻讀事務(wù)的隔離級別為了避免上述3種情況的發(fā)生,MySQL中為事務(wù)定義了不同的隔離級別,以此來保證數(shù)據(jù)的穩(wěn)定性。事務(wù)的隔離級別由低到高可分為ReadUncommitted、ReadCommitted、RepeatableRead、Serializable,如表所示:事務(wù)的隔離級別事務(wù)的隔離級別越高,越能保證數(shù)據(jù)的完整性和一致性,但是對并發(fā)性能的影響也會相應(yīng)增大。另外,不同的隔離級別可能會造成不同的并發(fā)異常,如表所示:事務(wù)的隔離級別在MySQL中,可以使用相關(guān)語句查看當(dāng)前會話的隔離級別,具體如下所示:同樣,用戶也可以使用SET
語句設(shè)置當(dāng)前會話的隔離級別,具體的語法格式如下所示:以上語法格式中,SESSION代表設(shè)置的是當(dāng)前會話的隔離級別,LEVEL后跟隨著4個可選參數(shù),分別對應(yīng)4個隔離級別。接下來將通過具體案例分別演示4個隔離級別可能引起的并發(fā)問題。
當(dāng)事務(wù)的隔離級別為ReadUncommitted(讀未提交)時,可能出現(xiàn)數(shù)據(jù)的臟讀問題,即一個事務(wù)讀取了另一個事務(wù)未提交的數(shù)據(jù)。在演示過程中將打開兩個客戶端會話窗口,以此來模仿不同的事務(wù)操作同一數(shù)據(jù)的場景,敘述中將這兩個客戶端分別簡稱為客戶端A和客戶端B。
另外,上文中已經(jīng)提到,MySQL默認(rèn)的隔離級別為RepeatableRead(可重復(fù)讀),這里對A、
B客戶端默認(rèn)的隔離級別也未作修改。接下來將通過不斷改變客戶端A的隔離級別,同時在客戶端B修改數(shù)據(jù),來演示各個隔離級別出現(xiàn)的問題。1.臟讀問題事務(wù)的隔離級別事務(wù)的隔離級別首先,將客戶端A的隔離級別設(shè)置為ReadUncommitted(讀未提交),SQL語句如下所示:以上執(zhí)行結(jié)果證明客戶端A的隔離級別設(shè)置為了ReadUncommitted(讀未提交)。在客戶端A中查詢account表的數(shù)據(jù),SQL語句如下所示:事務(wù)的隔離級別然后在客戶端B中進行事務(wù)操作。在開啟事務(wù)后,執(zhí)行賬戶A轉(zhuǎn)賬給賬戶C100元的數(shù)據(jù)操作,但不進行事務(wù)的提交,SQL語句如下所示:事務(wù)的隔離級別以上執(zhí)行結(jié)果證明賬戶A成功轉(zhuǎn)賬給賬戶C100元。此時通過客戶端A查看account表中的數(shù)據(jù),SQL語句如下所示。
從以上執(zhí)行結(jié)果可看出,在客戶端A中查詢account表中的數(shù)據(jù),發(fā)現(xiàn)賬戶A已經(jīng)給賬戶C轉(zhuǎn)賬了100元,但此時客戶端B中的事務(wù)還沒有提交,客戶端A讀取到了客戶端B還未提交事務(wù)修改的數(shù)據(jù),即臟數(shù)據(jù)。這種情況很容易造成數(shù)據(jù)的混亂,使數(shù)據(jù)的一致性遭到破壞。事務(wù)的隔離級別此時,在客戶端B對事務(wù)進行回滾操作,具體的SQL語句如下所示:
從以上執(zhí)行結(jié)果可以看出,客戶端B成功進行了事務(wù)回滾。此時通過客戶端A再次查詢account表中的數(shù)據(jù),SQL語句如下所示:從代碼的執(zhí)行結(jié)果可以看出,客戶端A查詢到了客戶端B事務(wù)回滾后的數(shù)據(jù)。在實際應(yīng)用中應(yīng)該根據(jù)實際情況合理地使用ReadUncommitted(讀未提交)隔離級別,以此來減少數(shù)據(jù)的臟讀問題。當(dāng)事務(wù)的隔離級別設(shè)置為ReadCommitted(讀已提交)時,一個事務(wù)在對數(shù)據(jù)進行查詢的過程中可能會遇到其他事務(wù)對數(shù)據(jù)進行修改的情況,從而導(dǎo)致事務(wù)中的兩次查詢結(jié)果不一致,即出現(xiàn)數(shù)據(jù)的不可重復(fù)讀問題。下面將對這種情況進行詳細(xì)的演示。2.不可重復(fù)讀問題事務(wù)的隔離級別事務(wù)的隔離級別首先,將客戶端A的隔離級別設(shè)置為ReadCommitted(讀已提交),SQL語句如下所示:從上方代碼的執(zhí)行結(jié)果可以看出,客戶端A的隔離級別設(shè)置為了ReadCommitted(讀已提交)。這時在客戶端A中開啟一個查詢account表數(shù)據(jù)的事務(wù),SQL語句如下所示:事務(wù)的隔離級別然后在客戶端B中進行事務(wù)操作。開啟事務(wù)后,進行賬戶A轉(zhuǎn)賬給賬戶C100元的數(shù)據(jù)操作并提交事務(wù),SQL語句如下所示:事務(wù)的隔離級別從以上執(zhí)行結(jié)果可看出,客戶端B中的事務(wù)操作完成,賬戶A給賬戶C轉(zhuǎn)賬了100元,此時在未提交事務(wù)的客戶端A中再次查詢account表中的數(shù)據(jù)信息,SQL語句如下所示:從以上代碼的執(zhí)行結(jié)果可看出,從客戶端A中查詢出了客戶端B修改后的數(shù)據(jù),也就是說客戶端A在同一個事務(wù)中分別在不同時間段查詢同一個表的結(jié)果不一致,即數(shù)據(jù)的不可重復(fù)讀問題。幻讀問題的出現(xiàn)與不可重復(fù)讀問題的出現(xiàn)原因類似,當(dāng)事務(wù)的隔離級別為RepeatableRead(可重復(fù)讀)時,一個事務(wù)在查詢過程中,其他事務(wù)可能會對數(shù)據(jù)繼續(xù)更新操作,從而導(dǎo)致兩次查詢的數(shù)據(jù)條數(shù)不一致。下面將針對事務(wù)中出現(xiàn)幻讀的情況進行詳細(xì)的演示和說明。3.幻讀問題事務(wù)的隔離級別事務(wù)的隔離級別首先,將客戶端A的隔離級別設(shè)置為RepeatableRead(可重復(fù)讀),SQL語句如下所示:事務(wù)的隔離級別從上方代碼的執(zhí)行結(jié)果可以看出,客戶端A的隔離級別成功設(shè)置為了RepeatableRead(可重復(fù)讀)。接下來,在客戶端A中開啟一個查詢account表數(shù)據(jù)的事務(wù),SQL語句如下所示:事務(wù)的隔離級別然后在客戶端B中進行更新操作,添加一個余額為500元的賬戶D,SQL語句如下所示:從以上執(zhí)行結(jié)果可看出,客戶端B中的數(shù)據(jù)添加操作執(zhí)行成功,此時在未提交事務(wù)的客戶端A中查詢account表中的數(shù)據(jù),SQL語句如下所示:從執(zhí)行結(jié)果可以看出,在客戶端A中查詢account表的數(shù)據(jù)并沒有出現(xiàn)幻讀的問題,這與之前預(yù)期的結(jié)果并不相同。出現(xiàn)這種情況的主要原因是MySQL的存儲引擎通過多版本并發(fā)控制(MultiVersionConcurrencyControl,MVCC)機制解決了數(shù)據(jù)幻讀的問題。因此,當(dāng)MySQL的隔離級別為RepeatableRead(可重復(fù)讀)時,是可以避免幻讀問題的出現(xiàn)的。事務(wù)的隔離級別
Serializable(可串行化)為最高的事務(wù)隔離級別,該級別會在每一行讀取的數(shù)據(jù)上都加鎖,從而使各事務(wù)之間不會出現(xiàn)相互沖突,但這種方式會導(dǎo)致系統(tǒng)資源占用過多,出現(xiàn)大量的超時現(xiàn)象。下面將對這種隔離級別進行演示和說明。4.可串行化事務(wù)的隔離級別事務(wù)的隔離級別首先,將客戶端A的隔離級別設(shè)置為Serializable(可串行化),SQL語句如下所示:然后在客戶端A中開啟一個查詢account表數(shù)據(jù)的事務(wù),具體的SQL語句如下所示:事務(wù)的隔離級別接著在客戶端B中進行更新操作,添加一個余額為800元的賬戶E,SQL語句如下所示:從執(zhí)行結(jié)果可以看出操作超時,導(dǎo)致數(shù)據(jù)添加失敗。造成這種現(xiàn)象的原因是此時客戶端A的事務(wù)隔離級別為
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 運輸木材用掛車企業(yè)制定與實施新質(zhì)生產(chǎn)力戰(zhàn)略研究報告
- 2025年管件鑄造模具項目可行性研究報告
- 2025年新入職工職前安全培訓(xùn)考試試題附答案(基礎(chǔ)題)
- 25年車間職工安全培訓(xùn)考試試題及參考答案【考試直接用】
- 2024-2025部門安全培訓(xùn)考試試題附答案【基礎(chǔ)題】
- 25年員工三級安全培訓(xùn)考試試題及參考答案(基礎(chǔ)題)
- 2025年硅橡膠導(dǎo)電斑馬膠條項目可行性研究報告
- 2025年-天津建筑安全員-C證(專職安全員)考試題庫
- 2025年眼鏡防盜扣項目可行性研究報告
- 2025年直柄風(fēng)動砂輪機項目可行性研究報告
- 《紅色旅游線路設(shè)計》
- 設(shè)備出廠檢驗報告
- EXCEL公式進行經(jīng)緯度與XY坐標(biāo)的相互轉(zhuǎn)換
- 紫銅材質(zhì)證明
- 妊娠期甲狀腺疾病課件
- 導(dǎo)線的連接精品課件
- 論提高行政效率的途徑 開題報告
- 059.商業(yè)計劃書和可行性報告精制食油廠年產(chǎn)萬噸精制山茶油項目可行性研究報告
- 米度盾構(gòu)導(dǎo)向系統(tǒng)
- [說明]心血管內(nèi)科(心內(nèi)科)_見習(xí)教案_6_動脈粥樣硬化和冠狀動脈粥樣硬化性心臟病
- Q∕GDW 11257.3-2020 熔斷器技術(shù)規(guī)范 第3部分:跌落式熔斷器
評論
0/150
提交評論