溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Mysql InnoDB的事務(wù)特征和隔離級(jí)別詳解

發(fā)布時(shí)間:2021-09-16 07:21:27 來源:億速云 閱讀:95 作者:chen 欄目:大數(shù)據(jù)

本篇內(nèi)容主要講解“Mysql InnoDB的事務(wù)特征和隔離級(jí)別詳解”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Mysql InnoDB的事務(wù)特征和隔離級(jí)別詳解”吧!

Mysql-innodb-事務(wù)特征ACID

1.原子性(Atomicity):每一個(gè)事務(wù)都是一個(gè)不可分割的執(zhí)行單元,該執(zhí)行單元中包含一組的數(shù)據(jù)庫的操作,要么都執(zhí)行成功,要么執(zhí)行失敗全部回滾。
2.一致性(consistency):一致性體現(xiàn)在事務(wù)完成之后,所有的數(shù)據(jù)狀態(tài)都是一致的。
3.隔離性(isolation):事務(wù)與事務(wù)執(zhí)行時(shí)對(duì)數(shù)據(jù)的可見性隔離級(jí)別定義,根據(jù)不同的隔離程度,來控制讀寫的數(shù)據(jù)可見性,一般的指事物與事物之間是相互隔離的,互相獨(dú)立的。下面會(huì)詳細(xì)描述不同的隔離級(jí)別。
4.持久性(durability):事務(wù)執(zhí)行完,數(shù)據(jù)的狀態(tài)將會(huì)永久的保存下來。

前言

     在說之前我們先了解一下臟讀,不可重復(fù)讀,可重復(fù)讀,幻象讀概念:
1.臟讀:就是事務(wù)可以讀到其他事務(wù)未提交的事務(wù),但是在實(shí)際應(yīng)用開發(fā)中一般的不能出現(xiàn)這種情況,讀到不可靠的數(shù)據(jù),導(dǎo)致出現(xiàn)異常數(shù)據(jù),但是相信存在既有價(jià)值,臟讀的好處是讀取時(shí)不會(huì)對(duì)表或記錄行加鎖,也就是讀寫的時(shí)候不會(huì)阻塞等待,適合一些更新特別頻繁的數(shù)據(jù)操作,并且不會(huì)場景中事務(wù)之間不會(huì)出現(xiàn)交叉查詢。
2.不可重復(fù)讀:就是事務(wù)中多次讀取一條記錄和最開始的讀取結(jié)果不一致。如果一個(gè)事務(wù)中,讀取操作不加排他鎖,當(dāng)多次執(zhí)行一樣的select 語句時(shí),命中的數(shù)據(jù)行可能已經(jīng)被其它事務(wù)修改了,這時(shí)候,就讀到了其他結(jié)果,這就是不可重復(fù)讀。
3.可重復(fù)讀:就是事務(wù)中多次讀取一條記錄和最開始的讀取結(jié)果一致。所以mysql-innodb默認(rèn)的隔離級(jí)別就是它,也是因?yàn)槭聞?wù)開始的時(shí)候就會(huì)對(duì)相關(guān)的行記錄加鎖。
4.幻象讀:是指兩次執(zhí)行同一條 select 語句會(huì)出現(xiàn)不同的結(jié)果,第二次讀會(huì)增加一數(shù)據(jù)行,例如事務(wù)A更新數(shù)據(jù),事務(wù)B在對(duì)更新后的結(jié)果進(jìn)行了更新后隨后同一事務(wù)中的SELECT能夠看到B事務(wù)操作完成后之前不存在的記錄。這時(shí)候和可重復(fù)讀不一樣,這里是出現(xiàn)新增或者刪除行。

事務(wù)的隔離級(jí)別

    這里討論mysql數(shù)據(jù)庫Innodb的事務(wù)隔離級(jí)別,從低到高。
1.讀未提交(Read UnCommitted)簡稱RU:其他事務(wù)可以讀到未提交的事務(wù),該級(jí)別是最低的隔離,會(huì)出現(xiàn)臟讀現(xiàn)象。
2.讀已提交(Read Committed)簡稱RC:只能讀取到已提交的事務(wù),可以防止臟讀,但是會(huì)出現(xiàn)不可重復(fù)讀,就是同一個(gè)事務(wù)中對(duì)同一條數(shù)據(jù)查詢可能會(huì)出現(xiàn)不同的結(jié)果。也會(huì)造成幻讀現(xiàn)象;
3.可重復(fù)讀(Repeatable Read)簡稱RR:是Mysql-innodb引擎默認(rèn)的隔離級(jí)別。同一個(gè)事務(wù)中對(duì)同一條數(shù)據(jù)重復(fù)查詢的結(jié)果和最開始查詢的結(jié)果是一致的,就是可以重復(fù)讀。雖然該隔離級(jí)別消除了不可重復(fù)讀,但是一般的數(shù)據(jù)庫引擎還是會(huì)存在幻象讀,但是innoDB解決了幻讀。

InnoDB使用Next-key Lock來解決”幻讀“。InnoDB默認(rèn)事務(wù)隔離級(jí)別為REPEATABLE READ,該隔離級(jí)別下InnoDB使用Next-key Lock來鎖住相關(guān)索引記錄以及記錄之前的”間隙“,以保證其他session中的事務(wù)不僅不能更新記錄而且不能在其中插入數(shù)據(jù),從而避免”幻讀“問題。InnoDB中通過Record Lock, Gap Lock 和Next-Key Lock鎖機(jī)制來實(shí)現(xiàn)訪問控制,這里今天不做過多討論。下一篇將詳細(xì)討論。

4.串行化(Serializable):這是最高的隔離級(jí)別,每個(gè)事務(wù)都會(huì)串行化處理,每次讀都需要獲得表級(jí)共享鎖,讀寫相互都會(huì)阻塞。

隔離級(jí)別總結(jié)

隔離級(jí)別臟讀不可重復(fù)讀幻讀
未提交讀(Read uncommitted)可能可能可能
已提交讀(Read committed)不可能可能可能
未提交讀(Read uncommitted)不可能不可能可能(mysql-innodb不會(huì))
未提交讀(Read uncommitted)不可能不可能不可能

mysql鎖知識(shí)擴(kuò)展

      上面講了很多鎖相關(guān)的概念,下面簡單的快速帶入理解一下概念,不做具體詳細(xì)分析。mysql鎖機(jī)制分為表級(jí)鎖和行級(jí)鎖,頁級(jí)鎖。行鎖中有共享鎖和排他鎖之分。
1.表級(jí)鎖:就是鎖住整張表,開銷小,加鎖速度快,鎖粒度大,鎖的資源多,沖突概率高,容易發(fā)生死鎖,并發(fā)極低。
2.行級(jí)鎖:就是記錄行,定位開銷大,加鎖速度慢,粒度小,鎖住資源小,發(fā)生沖突概率小,并發(fā)相對(duì)高。
3.頁面鎖:介于表和行之間,給相鄰一組記錄加鎖,并發(fā)一般。

行級(jí)鎖細(xì)分-共享鎖&排他鎖

      行級(jí)鎖細(xì)分-共享鎖&排他鎖
1.共享鎖又稱為讀鎖,簡稱S鎖,顧名思義,共享鎖就是多個(gè)事務(wù)對(duì)于同一數(shù)據(jù)可以共享一把鎖,都能訪問到數(shù)據(jù),但是只能讀不能修改。
2.排他鎖又稱為寫鎖,簡稱X鎖,顧名思義,排他鎖就是不能與其他所并存,它是獨(dú)占的。如一個(gè)事務(wù)獲取了一個(gè)數(shù)據(jù)行的排他鎖,其他事務(wù)就不能再獲取該行的其他鎖,包括共享鎖和排他鎖,但是獲取排他鎖的事務(wù)是可以對(duì)數(shù)據(jù)就行讀取和修改。

備注:這里說一下排他鎖:mysql InnoDB引擎默認(rèn)的隔離級(jí)別在修改數(shù)據(jù)語句,update,delete,insert都會(huì)自動(dòng)給涉及到的數(shù)據(jù)加上排他鎖。select語句默認(rèn)不會(huì)加任何鎖類型,如果想加排他鎖可以使用select …for update語句,共享鎖可以使用select … lock in share mode。所以加過排他鎖的數(shù)據(jù)行在其他事務(wù)種是不能修改數(shù)據(jù)的,也不能通過for update和lock in share mode鎖的方式查詢數(shù)據(jù),但可以直接通過select …from…查詢數(shù)據(jù),因?yàn)槠胀ú樵儧]有任何鎖機(jī)制。

樂觀鎖和悲觀鎖

      有的人問樂觀鎖和悲觀鎖又是啥?這里也說一下,本人覺得樂觀鎖和悲觀鎖并不是數(shù)據(jù)庫專有的,任何的鎖機(jī)制都會(huì)相關(guān)概念,不要和行鎖表鎖和共享排他鎖弄混了,悲觀和樂觀鎖其實(shí)是一種并發(fā)控制。這里說一下數(shù)據(jù)庫的樂觀鎖和悲觀鎖的實(shí)現(xiàn)。
1.樂觀鎖:使用數(shù)據(jù)庫版本號(hào)或者時(shí)間戳方式實(shí)現(xiàn),并發(fā)訪問,當(dāng)兩次操作都是相同的版本號(hào),則認(rèn)為可以執(zhí)行。樂觀鎖假設(shè)認(rèn)為數(shù)據(jù)一般情況下不會(huì)造成沖突,所以在數(shù)據(jù)進(jìn)行提交更新的時(shí)候,才會(huì)正式對(duì)數(shù)據(jù)的沖突與否進(jìn)行檢測,如果發(fā)現(xiàn)沖突了,則讓返回用戶錯(cuò)誤的信息,讓用戶決定如何去做。
2.悲觀鎖:是先獲取鎖,再操作的方式,如果沒有獲得鎖,則拋出異?;蛘叩却尫沛i。數(shù)據(jù)庫中也是通過行鎖,表鎖等機(jī)制進(jìn)行訪問控制的。

到此,相信大家對(duì)“Mysql InnoDB的事務(wù)特征和隔離級(jí)別詳解”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI