mysql8事務級別_Mysql幾種事務隔離級別

前言:之前對mysql的基礎知識通過了幾篇博客進行了一個詳解,包括從數據庫系統的原理以及最基本的操作使用,此篇博客將主要對mysql的事務級別進行實戰分析

1.什么是事務?

事務是應用程序中一系列嚴密的操作,所有操作必須成功完成,否則在每個操作中所作的所有更改都會被撤消。也就是事務具有原子性,一個事務中的一系列的操作要么全部成功,要么全部失敗

2.事務的基本要素

原子性(Atomicity):事務開始后所有操作,要么全部做完,要么全部不做,不可能停滯在中間環節。事務執行過程中出錯,會回滾到事務開始前的狀態。

一致性(Consistency):事 務執行的結果必須是使數據庫從一個一致性狀態變到另一個一致性狀態。因此當數據庫只包含成功事務提交的結果時,就說數據庫處于一致性狀態。

隔離性(Isolation):一個事務的執行不能其它事務干擾。即一個事務內部的操作及使用的數據對其它并發事務是隔離的,并發執行的各個事務之間不能互相干擾。

持久性(Durability):事務完成后,事務對數據庫的所有更新將被保存到數據庫,對數據庫中的數據的改變就應該是永久性,不能回滾。

3.事務出現的并發問題

臟讀:事務A讀取了事務B更新的數據,然后B回滾操作,那么A讀取到的數據是臟數據

不可重復讀:事務 A 多次讀取同一數據,事務 B 在事務A多次讀取的過程中,對數據作了更新并提交,導致事務A多次讀取同一數據時,結果 不一致

幻讀:它發生在一個事務A讀取了幾行數據,接著另一個并發事務B插入了一些數據時。在隨后的查詢中,事務A就會發現多了一些原本不存在的記錄,就好像發生了幻覺一樣,所以稱為幻讀

4.事務的隔離級別

如上都是一些概念的東西,沒有什么意思,還是需要通過實戰來演示一下其中的原理以及奧秘,先放個圖:

ac11ac120b88aca62d67d18057aa9548.png

mysql默認的事務隔離級別是rr,也就是可重復讀級別(mysql8.0)

6642868c75238d73ab195369a25d5b2b.png

接下來通過操作數據庫對各個事物隔離級別以及實現的原理進行介紹:

1.讀未提交

(1)打開一個mysql客戶端A,并設置當前事務模式為read uncommitted(未提交讀),開啟事務,查詢user表的所有記錄

- - >客戶端A

dc7cfaecc4e9e115f6d867aeda45bd1a.png

(2)在客戶端A的事務提交之前,打開另一個mysql客戶端B,開啟事務,更新表user

- - >客戶端 B

8fff4f470fdd2b7658cfb2f9aa8e3a4b.png

(3)此時,客戶端B的事務還沒提交,但是客戶端A就可查詢到B已經更新的數據

- - >客戶端A

2d5637cb05a557c56a64b57128307a29.png

(4)一旦客戶端B的事務因為某種原因回滾,所有的操作都將會被撤銷,那客戶端A查詢到的數據其實就是臟數據

- - >客戶端 B

3ab15167b08679161dab34e5c367bc4c.png

(5)在客戶端A執行更新語句update user set age = age + 1where id =1,可以看到 lisa 的 age 沒有變成100,而是18,導致數據不一致,這是因為在應用程序中,我們會用99+1=100,并不知道其他會話回滾,要想解決這個問題可以采用讀已提交的隔離級別

- - >客戶端A

ed5b0d78cb9691ab224b3a448d663552.png

2.讀已提交

(1)打開一個客戶端A,并設置當前事務模式為read committed(未提交讀),開啟事務,查詢表user的所有記錄

- - >客戶端A

030212a19575d7ceb8835477f3b8b641.png

(2)在客戶端A的事務提交之前,打開另一個客戶端B,開啟事務,更新表user

- - >客戶端 B

6ebbc4a656d811ea929554a124f85694.png

(3)此時,客戶端B的事務還沒提交,客戶端A不能查詢到B已經更新的數據,解決了臟讀問題

- - >客戶端A

d370a11ed499211e3eb0f22c16e21772.png

(4)客戶端B事務被提交

- - >客戶端B

e12cecc3326031d4d5c29e51a41ee3a4.png

(5)客戶端A執行與上一步相同的查詢,結果 與上一步不一致,所以就產生了不可重復讀的問題,要想解決這個問題可以采用可重復讀的隔離級別

- - >客戶端A

84f05a72a359aed43ab8682a346fa438.png

3.可重復讀

(1)打開一個客戶端A,并設置當前事務模式為repeatable read,開啟事務,查詢表user的所有記錄

- - >客戶端A

96638631d0c711a0e5b17065a3894eb9.png

(2)在客戶端A的事務提交之前,打開另一個客戶端B,開啟事務,更新表user并提交

- - >客戶端B

92bff16f79c295819bb84fa7e791aaad.png

(3)在客戶端A查詢表user的所有記錄,與第一次查詢結果一致,沒有出現不可重復讀的問題

- - >客戶端A

c132ccfd9ccc2268ebc2956e08eea443.png

(4)在客戶端A,接著執行update user set age = age + 1 where id = 1,發現age沒有變成17+1=18,lisa的age值用的是步驟客戶端B中的99來算的,所以是100,數據的一致沒有被破壞。這是因為可重復讀的隔離級別下使用了MVCC機制,select操作不會更新版本號,是快照讀(歷史版本);而insert、update和delete會更新版本號,是當前讀(當前版本)。

- - >客戶端A

84136700d9905397242bd4892631c7ff.png

(5)重新打開客戶端B,開啟事務,插入一條新數據后提交

*- - >客戶端 B *

a22064a2251ad3c708f9639cf3683d86.png

(6)在客戶端A查詢表user的所有記錄,沒有查出新增數據,但是卻發現讀的不是最新數據,這就是所謂的“幻讀”

- - >客戶端A

a7509d61f9b7aa503736b128a14ccc35.png

(7)在客戶端A提交本次事務,再次讀取數據,發現讀取正常

- - >客戶端A

dcebe7cb3faf95d114434e7fc6dc0821.png

4.串行化

(1)打開一個客戶端A,并設置當前事務模式為可串行化(Serializable),開啟事務,查詢表user的所有記錄

- - >客戶端A

fbd15df01cd4c9b0573748b0fad3ea6d.png

(2)打開一個客戶端B,并設置當前事務模式為可串行化(Serializable),開啟事務,向user表中新添加一條數據

- - >客戶端 B

184b5091b75b8632b10358511c6b8efe.png

(3)提交A客戶端事務,然后發現B客戶端插入數據成功

006e7fad0b6f05d41d38f005097ef187.png

serializable完全鎖定字段,若一個事務來查詢同一份數據就必須等待,直到前一個事務完成并解除鎖定為止。是完整的隔離級別,會鎖定對應的數據表格,因而會有效率的問題

看這里↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

綜上就是針對于mysql事務各種隔離級別的原理實現以及解決辦法,在這里博主給各位游客出個mysql的面試題,你會嗎?

問題:兩個表結構完全相同,在不用not in的情況下根據name查出user表里有,但是user1表里沒有的數據

以此題為例:查詢結果是 gaowei,peter,jack 三條數據

69fb7678636c043f45ceb6c82984aca0.png

77649a1c2404366a0f0003a87487ec8f.png

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/538514.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/538514.shtml
英文地址,請注明出處:http://en.pswp.cn/news/538514.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

控制臺應用和空項目有什么區別_互聯網小程序的應用以及APP的應用有什么區別及發展...

隨時移動互聯網進入的千家萬戶,互聯網的手機應用程序也漸漸的在市場上流行起來了。今天主要跟大家談一下互聯網小程序的應用以及APP的應用有什么區別以及未來的發展趨。未來會流行什么手機應用或者APP應用,我帶大家都為了解一下。下邊先來了解一下小程序…

day19_java基礎加強_動態代理+注解+類加載器

一、動態代理 1.1、代理模式 什么是代理模式及其作用? Proxy Pattern(即:代理模式),23種常用的面向對象軟件的設計模式之一。? ? ? ? 代理模式的定義:為其他對象提供一種代理以控制對這個對象的訪問。?…

mysql壓力寫入測試_mysql壓力測試工具

相關推薦:測試工具測試工具 測試管理工具 Quality Center 基于WEB的測試管理工具 Test Director 功能測試工具 QuickTest Professional 性能測試工具 LoadRunner 哪位仁兄有相關…

python中隊列的應用用場景_消息隊列應用場景

原文http://blog.csdn.net/konglongaa/article/details/52208273一、消息隊列概述消息隊列中間件是分布式系統中重要的組件,主要解決應用解耦,異步消息,流量削鋒等問題,實現高性能,高可用,可伸縮和最終一致…

oracle獲取一段時間內所有的小時、天、月

原文鏈接:http://blog.csdn.net/ld422586546/article/details/9626921/ 點擊閱讀原文 ---------------------------------------------------------------------- 獲取一段時間內所有的小時 SELECT to_date(2013-07-01 12, yyyy-mm-dd hh24) (ROWNUM - 1) / 24 s…

eclipse快捷鍵、智能提示

1、Alt / 調出智能提示功能,即使在XML文件中; 2、 轉載于:https://www.cnblogs.com/JAVA-STUDYER/p/9143862.html

python下載網頁歌詞_python3個人學習筆記-批量下載分析歌詞2

我發現之前自己真是太愚蠢了沒有搞清楚正則表達的各種用法。不同詞語的篩選根本不用像re.sub(另一個想替換的內容,另一個替換后的內容,re.sub(想要替換的內容,替換后的內容,x))這樣傻了吧唧地篩一層又一層……(受linux的pipe荼毒太深)正則表達中不同字符的or其實大家都知道是[a…

使用循環鏈表實現一個通訊錄的管理程序_【LeetCode鏈表題型總結】

點擊上方藍字,關注公眾號鏈表概念的講解鏈表是什么鏈表是一種線性數據結構,每個節點都存有數據,通過指針將各個節點鏈接在一起。鏈表的性質一致性: 每個節點有相同的數據結構,相同的數據大小,內存中占據相同的大小&…

win10 C盤超過50G?教你如何對C盤瘦身!

原文鏈接:http://blog.csdn.net/u012762305/article/details/53469446 點擊閱讀原文 ------------------------------------------- 本人C盤是128G SSD硬盤,Win10系統盤和一些常用的程序都裝在這個盤(特大程序除外),…

python的kite下載安裝及使用_Kite下載|Kite Python編程工具 V1.2020.1203.0 最新版下載 - 下載銀行...

Kite是一款專為Python打造的一款代碼補全軟件,如果你正在學習Python或是從事與Python相關的編程工作,那么這款軟件絕對是你的好幫手!其會智能判斷用戶想要輸入的每個代碼字段,并在所有庫中進行匹配相應的內容,如果看到…

layui前端時間戳轉化

https://blog.csdn.net/rightbeforethesix/article/details/80358890轉載于:https://www.cnblogs.com/newlangwen/p/9144204.html

單頁web應用是什么?它又會給傳統網站帶來哪些好處?

原文鏈接:http://blog.csdn.net/zuoninger/article/details/38842823 點擊閱讀原文 ---------------------------------------------------- 什么是單頁應用? 單頁應用是指在瀏覽器中運行的應用,它們在使用期間不會重新加載頁面。像所有的…

python圖像等比例壓縮_python使用pil進行圖像處理(等比例壓縮、裁剪)實例代碼

PIL中設計的幾個基本概念1.通道(bands):即使圖像的波段數,RGB圖像,灰度圖像以RGB圖像為例:>>>from PIL import Image>>>im Image.open(*.jpg) # 打開一張RGB圖像>>>im_bands im.getbands() # 獲取RG…

python的urllib四大模塊_Python常用的內建模塊4:urllib

urllib提供了一系列用于操作URL的功能Geturllib的request模塊可以非常方便的抓取URL的內容, 也就是發送一個GET請求到制定的頁面, 然后返回HTTP的響應:例如, 對豆瓣的一個URLhttps://api.douban.com/v2/book/2129650進行抓取, 并返回響應:from urllib import requestwith reque…

Linux 升級 Python 至 3.x

原文鏈接:http://blog.csdn.net/liang19890820/article/details/51079633 -------------------------------------------- 簡述 CentOS 7 中默認安裝了 Python,版本比較低(2.7.5),為了使用新版 3.x,需要對…

Sublime Text 3 配置python交互運行環境的快捷鍵

2019獨角獸企業重金招聘Python工程師標準>>> 使用Sublime Text 3能以輕量級的環境寫python腳本,運行python代碼。為了更加方便地調用python腳本,通過在Sublime Text 3中綁定快捷鍵的方式,實現一鍵調用python交互運行環境&#xff…

xftp如何搜索文件_頭條搜索站長平臺如何添加網站和sitemap文件?附圖文教程

頭條搜索站長平臺已經上線了,目前我們廣大站長都可以登錄該平臺后添加新網站和提交 sitemap 地圖文件,建議大家可以前往嘗試一下,多一個搜索平臺就多一條路,認為倒是挺好的。下面就跟大家簡單介紹頭條搜索站長平臺如何添加網站和提…

Angular4中常用管道

原文鏈接:http://blog.csdn.net/haijing1995/article/details/71404350 ----------------------------------------------------- Angular4中常用管道 通常我們需要使用管道實現對數據的格式化,Angular4中的管道和之前有了一些變化,下面說一…

mysql死鎖無法查詢_MySQL死鎖導致無法查詢

客服反饋后臺無法查詢,原因大概知道,是因為MySQL的事務產生了死鎖,以往都不知道是哪個事務鎖住了,只能很粗暴地重啟MySQL最近查找到一個方法,不用重啟MySQL,記錄如下登錄到MySQL,來看下有哪些My…

彩鉛練習,花船

圖片發自簡書App圖片發自簡書App