真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

mysql數(shù)據(jù)庫(kù)底層原理是什么

這篇“MySQL數(shù)據(jù)庫(kù)底層原理是什么”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來(lái)看看這篇“mysql數(shù)據(jù)庫(kù)底層原理是什么”文章吧。

成都創(chuàng)新互聯(lián)公司是一家專(zhuān)注于網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)與策劃設(shè)計(jì),英山網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)公司做網(wǎng)站,專(zhuān)注于網(wǎng)站建設(shè)十載,網(wǎng)設(shè)計(jì)領(lǐng)域的專(zhuān)業(yè)建站公司;建站業(yè)務(wù)涵蓋:英山等地區(qū)。英山做網(wǎng)站價(jià)格咨詢(xún):028-86922220

1.數(shù)據(jù)庫(kù)事務(wù)的基本特性。

原子性:

事務(wù)中的所有操作要么全部提交成功,要么全部失敗回滾。

場(chǎng)景:UPDATE cs_user SET age = 18 , gender = '女' WHERE id = 4。要么全部更新要么更新失敗,不會(huì)出現(xiàn)age更新成功,gender更新失敗。

一致性

據(jù)庫(kù)總是從給一個(gè)一致性的狀態(tài)轉(zhuǎn)換到另一個(gè)一致性的狀態(tài)。

場(chǎng)景:比如規(guī)定某個(gè)表的字段age大于等于12小于18時(shí),字段type為青少年,而數(shù)據(jù)庫(kù)中存在age=16的時(shí)候,type='兒童'。

隔離性:

一個(gè)事務(wù)所做的修改在提交之前對(duì)其它事務(wù)是不可見(jiàn)的。兩個(gè)以上的事務(wù)不會(huì)出現(xiàn)交錯(cuò)執(zhí)行的狀態(tài).因?yàn)檫@樣可能會(huì)導(dǎo)致數(shù)據(jù)不一致。

持久性:

一旦事務(wù)提交,其所做的修改便會(huì)永久保存在數(shù)據(jù)庫(kù)中。

事務(wù)在并發(fā)環(huán)境下出現(xiàn)的問(wèn)題。

臟讀(Dirty Read):一個(gè)事務(wù)讀取了另一個(gè)事務(wù)未提交的數(shù)據(jù)。如果另一個(gè)事務(wù)回滾,則讀取的數(shù)據(jù)將是無(wú)效的。

不可重復(fù)讀(Non-repeatable Read):同一事務(wù)內(nèi),兩次讀取同一數(shù)據(jù)得到的結(jié)果不同。這是因?yàn)樵趦纱巫x取之間,另一個(gè)事務(wù)修改了該數(shù)據(jù)。

幻讀(Phantom Read):同一事務(wù)內(nèi),兩次查詢(xún)得到的結(jié)果集不同。這是因?yàn)樵趦纱尾樵?xún)之間,另一個(gè)事務(wù)插入或刪除了一些數(shù)據(jù)。

丟失修改(Lost Update):兩個(gè)或多個(gè)事務(wù)同時(shí)修改同一數(shù)據(jù),其中一個(gè)事務(wù)的修改被另一個(gè)事務(wù)覆蓋,導(dǎo)致修改丟失。

不可重復(fù)讀的和幻讀很容易混淆,不可重復(fù)讀側(cè)重于修改,幻讀側(cè)重于新增或刪除。解決不可重復(fù)讀的問(wèn)題只需鎖住滿(mǎn)足條件的行,解決幻讀需要鎖表。

對(duì)于這些問(wèn)題的解決方法一般是有:事務(wù)隔離級(jí)別,樂(lè)觀鎖和悲觀鎖,MVCC(多版本并發(fā)控制)。

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

數(shù)據(jù)庫(kù)提供了多種事務(wù)隔離級(jí)別,不同的隔離級(jí)別提供了不同的并發(fā)控制機(jī)制,以解決并發(fā)問(wèn)題。

以下是數(shù)據(jù)庫(kù)的每一個(gè)事務(wù)隔離級(jí)別的詳細(xì)介紹:

READ UNCOMMITTED(讀未提交):該隔離級(jí)別允許事務(wù)讀取其他事務(wù)未提交的數(shù)據(jù),可能會(huì)出現(xiàn)臟讀、不可重復(fù)讀和幻讀的問(wèn)題。

READ COMMITTED(讀已提交):該隔離級(jí)別只允許事務(wù)讀取其他事務(wù)已提交的數(shù)據(jù),可以避免臟讀問(wèn)題,但不可避免不可重復(fù)讀和幻讀的問(wèn)題。

REPEATABLE READ(可重復(fù)讀):該隔離級(jí)別保證在同一事務(wù)中多次讀取同一數(shù)據(jù)得到的結(jié)果是一致的,可以避免臟讀和不可重復(fù)讀的問(wèn)題,但無(wú)法避免幻讀。

SERIALIZABLE(串行化):該隔離級(jí)別保證事務(wù)串行執(zhí)行,避免了以上所有并發(fā)問(wèn)題,但會(huì)影響并發(fā)性能。

READ UNCOMMITTED(讀未提交)

在READ UNCOMMITTED級(jí)別下,事務(wù)可以讀取未提交的數(shù)據(jù),沒(méi)有對(duì)數(shù)據(jù)進(jìn)行加鎖或版本控制。當(dāng)一個(gè)事務(wù)讀取數(shù)據(jù)時(shí),即使另一個(gè)事務(wù)正在修改該數(shù)據(jù),也不會(huì)阻塞讀取操作。這種實(shí)現(xiàn)方式可以提高讀取性能,但會(huì)導(dǎo)致臟讀的問(wèn)題。

優(yōu)點(diǎn):

讀取性能高:由于不需要加鎖或版本控制,因此讀取性能較高。

無(wú)鎖操作:該隔離級(jí)別不需要對(duì)數(shù)據(jù)進(jìn)行加鎖操作,因此可以避免鎖的競(jìng)爭(zhēng)問(wèn)題。

缺點(diǎn):

臟讀問(wèn)題:在READ UNCOMMITTED級(jí)別下,事務(wù)可以讀取其他事務(wù)未提交的數(shù)據(jù),因此可能會(huì)讀取到無(wú)效數(shù)據(jù),導(dǎo)致臟讀的問(wèn)題。

不可重復(fù)讀問(wèn)題:由于其他事務(wù)可以修改數(shù)據(jù),因此同一事務(wù)內(nèi)兩次讀取同一數(shù)據(jù)得到的結(jié)果可能不同。

幻讀問(wèn)題:由于其他事務(wù)可以插入或刪除數(shù)據(jù),因此同一事務(wù)內(nèi)兩次查詢(xún)得到的結(jié)果集可能不同??赡軐?dǎo)致數(shù)據(jù)不一致:由于讀取的數(shù)據(jù)可能是未提交的數(shù)據(jù),因此可能會(huì)導(dǎo)致數(shù)據(jù)不一致的問(wèn)題。

對(duì)于這個(gè)隔離級(jí)別,幾乎無(wú)法解決任何對(duì)于數(shù)據(jù)庫(kù)并發(fā)環(huán)境下數(shù)據(jù)不一致的錯(cuò)誤,但在一些對(duì)數(shù)據(jù)一致性要求不高,但讀取性能要求較高的系統(tǒng)中,可以考慮使用該隔離級(jí)別。

READ COMMITTED(讀已提交)

在READ COMMITTED級(jí)別下,事務(wù)只能讀取已提交的數(shù)據(jù),需要對(duì)數(shù)據(jù)進(jìn)行加鎖或版本控制。當(dāng)一個(gè)事務(wù)讀取數(shù)據(jù)時(shí),如果另一個(gè)事務(wù)正在修改該數(shù)據(jù),則需要等待該事務(wù)提交后才能讀取。這種實(shí)現(xiàn)方式可以避免臟讀的問(wèn)題,但可能會(huì)無(wú)法避免不可重復(fù)讀和幻讀的問(wèn)題。

優(yōu)點(diǎn):

避免臟讀問(wèn)題:由于只允許讀取已提交的數(shù)據(jù),因此可以避免臟讀的問(wèn)題。

數(shù)據(jù)一致性較高:由于只讀取已提交的數(shù)據(jù),因此數(shù)據(jù)一致性較高。

缺點(diǎn):

不可重復(fù)讀問(wèn)題:由于其他事務(wù)可以修改數(shù)據(jù),因此同一事務(wù)內(nèi)兩次讀取同一數(shù)據(jù)得到的結(jié)果可能不同。

幻讀問(wèn)題:由于其他事務(wù)可以插入或刪除數(shù)據(jù),因此同一事務(wù)內(nèi)兩次查詢(xún)得到的結(jié)果集可能不同。

鎖的競(jìng)爭(zhēng)問(wèn)題:由于需要對(duì)數(shù)據(jù)進(jìn)行加鎖,因此可能會(huì)導(dǎo)致鎖的競(jìng)爭(zhēng)問(wèn)題。

這個(gè)隔離級(jí)別解決了一部分并發(fā)問(wèn)題,但是還有一部分問(wèn)題沒(méi)有解決,適合應(yīng)用于對(duì)數(shù)據(jù)一致性要求較高的系統(tǒng)。如果需要更高的隔離級(jí)別,可以考慮使用REPEATABLE READ或SERIALIZABLE級(jí)別。

REPEATABLE READ(可重復(fù)讀)

在InnoDB中是這樣的:RR隔離級(jí)別保證對(duì)讀取到的記錄加鎖 (記錄鎖),同時(shí)保證對(duì)讀取的范圍加鎖,新的滿(mǎn)足查詢(xún)條件的記錄不能夠插入 (間隙鎖),因此不存在幻讀現(xiàn)象。但是標(biāo)準(zhǔn)的RR只能保證在同一事務(wù)中多次讀取同樣記錄的結(jié)果是一致的,而無(wú)法解決幻讀問(wèn)題。InnoDB的幻讀解決是依靠MVCC的實(shí)現(xiàn)機(jī)制做到的。Mysql默認(rèn)的隔離級(jí)別是RR。

優(yōu)點(diǎn):

避免臟讀和不可重復(fù)讀問(wèn)題:由于需要對(duì)數(shù)據(jù)進(jìn)行版本控制,因此可以避免臟讀和不可重復(fù)讀的問(wèn)題。

數(shù)據(jù)一致性較高:由于保證了同一事務(wù)內(nèi)多次讀取同一數(shù)據(jù)得到的結(jié)果一致,因此數(shù)據(jù)一致性較高。

缺點(diǎn):

鎖的競(jìng)爭(zhēng)問(wèn)題:由于需要對(duì)數(shù)據(jù)進(jìn)行版本控制,因此可能會(huì)導(dǎo)致鎖的競(jìng)爭(zhēng)問(wèn)題。

版本控制開(kāi)銷(xiāo):由于需要對(duì)數(shù)據(jù)進(jìn)行版本控制,因此可能會(huì)增加數(shù)據(jù)庫(kù)的存儲(chǔ)和計(jì)算開(kāi)銷(xiāo)。

幻讀解決

InnoDB的幻讀解決是依靠MVCC的實(shí)現(xiàn)機(jī)制: (增加系統(tǒng)版本號(hào),每次事務(wù)操作,會(huì)比較系統(tǒng)版本號(hào)) InnoDB為每行記錄添加了一個(gè)版本號(hào)(系統(tǒng)版本號(hào)),每當(dāng)修改數(shù)據(jù)時(shí),版本號(hào)加一。在讀取事務(wù)開(kāi)始時(shí),系統(tǒng)會(huì)給事務(wù)一個(gè)當(dāng)前版本號(hào),事務(wù)會(huì)讀取版本號(hào)<=當(dāng)前版本號(hào)的數(shù)據(jù),這時(shí)就算另一個(gè)事務(wù)插入一個(gè)數(shù)據(jù),并立馬提交,新插入這條數(shù)據(jù)的版本號(hào)會(huì)比讀取事務(wù)的版本號(hào)高,因此讀取事務(wù)讀的數(shù)據(jù)還是不會(huì)變。例如:此時(shí)books表中有5條數(shù)據(jù),版本號(hào)為1 事務(wù)A,系統(tǒng)版本號(hào)2:select * from books;因?yàn)?<=2所以此時(shí)會(huì)讀取5條數(shù)據(jù)。 事務(wù)B,系統(tǒng)版本號(hào)3:insert into books ...,插入一條數(shù)據(jù),新插入的數(shù)據(jù)版本號(hào)為3,而其他的數(shù)據(jù)的版本號(hào)仍然是2,插入完成之后commit,事務(wù)結(jié)束。 事務(wù)A,系統(tǒng)版本號(hào)2:再次select * from books;只能讀取<=2的數(shù)據(jù),事務(wù)B新插入的那條數(shù)據(jù)版本號(hào)為3,因此讀不出來(lái),解決了幻讀的問(wèn)題,而且兩個(gè)事務(wù)同時(shí)修改同一數(shù)據(jù),則會(huì)生成兩個(gè)不同的版本,從而避免數(shù)據(jù)丟失的問(wèn)題,解決了丟失修改問(wèn)題。

mysql鎖

在mysql中使用的鎖一般是兩種類(lèi)型,樂(lè)觀鎖和悲觀鎖。

樂(lè)觀鎖概念

是由我們自己實(shí)現(xiàn)的一個(gè)版本控制。在表中的數(shù)據(jù)進(jìn)行操作時(shí)(更新),先給數(shù)據(jù)表加一個(gè)版本(version)字段,每操作一次,將那條記錄的版本號(hào)加1。也就是先查詢(xún)出那條記錄,獲取出version字段,如果要對(duì)那條記錄進(jìn)行操作(更新),則先判斷此刻version的值是否與剛剛查詢(xún)出來(lái)時(shí)的version的值相等,如果相等,則說(shuō)明這段期間,沒(méi)有其他程序?qū)ζ溥M(jìn)行操作,則可以執(zhí)行更新,將version字段的值加1;如果更新時(shí)發(fā)現(xiàn)此刻的version值與剛剛獲取出來(lái)的version的值不相等,則說(shuō)明這段期間已經(jīng)有其他程序?qū)ζ溥M(jìn)行操作了,則不進(jìn)行更新操作

悲觀鎖概念

這個(gè)由數(shù)據(jù)庫(kù)實(shí)現(xiàn),對(duì)于悲觀鎖在操作數(shù)據(jù)時(shí),認(rèn)為此操作會(huì)出現(xiàn)數(shù)據(jù)沖突,所以在進(jìn)行每次操作時(shí)都要通過(guò)獲取鎖才能進(jìn)行對(duì)相同數(shù)據(jù)的操作。在悲觀鎖中又有兩種類(lèi)型,分別是共享鎖與排它鎖。

共享鎖(讀鎖)

對(duì)于共享鎖來(lái)說(shuō),他的作用是在一個(gè)事務(wù)對(duì)數(shù)據(jù)A加上共享鎖后,其他的事務(wù)只能在對(duì)數(shù)據(jù)A加共享鎖,無(wú)法加其他鎖,只有全部共享鎖釋放后才能加其他鎖(基本上就是排它鎖)。這句話(huà)的意思其實(shí)就是,有一個(gè)事務(wù)正在讀數(shù)據(jù)A,那么其他事務(wù)也只能讀數(shù)據(jù)A,而無(wú)法修改數(shù)據(jù)A,只有在所有事務(wù)對(duì)數(shù)據(jù)A的訪(fǎng)問(wèn)都完成后,才能進(jìn)行修改。

排它鎖(寫(xiě)鎖)

對(duì)于排它鎖來(lái)說(shuō),作用是在一個(gè)事務(wù)對(duì)數(shù)據(jù)A加上排它鎖后,只有這個(gè)事務(wù)可以對(duì)數(shù)據(jù)進(jìn)行讀取和修改,其他的事務(wù)都無(wú)法對(duì)這個(gè)數(shù)據(jù)進(jìn)行讀取和修改,當(dāng)然也無(wú)法對(duì)這個(gè)數(shù)據(jù)加鎖。

使用方式:在需要執(zhí)行的語(yǔ)句后面加上for update就可以了

行鎖和表鎖

對(duì)于悲觀鎖來(lái)說(shuō)

有行鎖和表鎖兩種區(qū)別,

行鎖是給某一行加上鎖,也就是一條記錄加上鎖。

行級(jí)鎖都是基于索引的,如果一條SQL語(yǔ)句用不到索引是不會(huì)使用行級(jí)鎖的,會(huì)使用表級(jí)鎖(這也是為什么sql語(yǔ)句盡量保證走索引原因之一)

表鎖:沒(méi)有使用索引的情況是鎖定全表的。

死鎖

死鎖(Deadlock) 所謂死鎖:是指兩個(gè)或兩個(gè)以上的進(jìn)程在執(zhí)行過(guò)程中,因爭(zhēng)奪資源而造成的一種互相等待的現(xiàn)象,若無(wú)外力作用,它們都將無(wú)法推進(jìn)下去。此時(shí)稱(chēng)系統(tǒng)處于死鎖狀態(tài)或系統(tǒng)產(chǎn)生了死鎖,這些永遠(yuǎn)在互相等待的進(jìn)程稱(chēng)為死鎖進(jìn)程。由于資源占用是互斥的,當(dāng)某個(gè)進(jìn)程提出申請(qǐng)資源后,使得有關(guān)進(jìn)程在無(wú)外力協(xié)助下,永遠(yuǎn)分配不到必需的資源而無(wú)法繼續(xù)運(yùn)行,這就產(chǎn)生了一種特殊現(xiàn)象死鎖。

以上就是關(guān)于“mysql數(shù)據(jù)庫(kù)底層原理是什么”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對(duì)大家有幫助,若想了解更多相關(guān)的知識(shí)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


分享標(biāo)題:mysql數(shù)據(jù)庫(kù)底層原理是什么
地址分享:http://weahome.cn/article/pjosej.html

其他資訊

在線(xiàn)咨詢(xún)

微信咨詢(xún)

電話(huà)咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部