溫馨提示×

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

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

重新學(xué)習(xí)MySQL數(shù)據(jù)庫(kù)開(kāi)篇:數(shù)據(jù)庫(kù)的前世今生

發(fā)布時(shí)間:2020-08-12 20:05:19 來(lái)源:ITPUB博客 閱讀:154 作者:a724888 欄目:MySQL數(shù)據(jù)庫(kù)
本文內(nèi)容出自劉欣的“碼農(nóng)翻身”公眾號(hào),強(qiáng)烈推薦劉欣大大的文章。
 
數(shù)據(jù)庫(kù)的前世今生
小李的數(shù)據(jù)庫(kù)之旅
無(wú)紙化辦公
小李是這個(gè)大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)系的知名學(xué)生,他的編程能力了得,使用Pascal 爐火純青,這都是高中期間參加全國(guó)青少年信息學(xué)奧林匹克競(jìng)賽打下的底子,  雖然沒(méi)有獲過(guò)獎(jiǎng),但在80年代末,90年代初很多人都不知道計(jì)算機(jī)是何物的時(shí)候,人家就可以在上面寫程序了, 是非常讓人敬佩的事情。
 
所以一入學(xué),輔導(dǎo)員就找到小李讓他幫忙給系里開(kāi)發(fā)個(gè)信息系統(tǒng), 記錄系里的學(xué)生信息,課程信息, 還有選課, 這樣的話就可以無(wú)紙化辦公了 。
 
小李覺(jué)得這只是一個(gè)基于命令行的程序, 無(wú)非是增刪改查嘛,就滿口應(yīng)承下來(lái), 然后祭出Pascal ,準(zhǔn)備大干一場(chǎng)。 
 
輔導(dǎo)員把相關(guān)的資料也送來(lái)了, 這學(xué)生信息無(wú)非是[學(xué)號(hào),姓名,性別,身份證號(hào),入學(xué)日期,班級(jí)] 等信息。 
課程信息也就是[課程號(hào),課程名,授課老師] ,    選課是[學(xué)號(hào),課程號(hào),成績(jī)]
 
有了基本的數(shù)據(jù)結(jié)構(gòu), 小李決定用三個(gè)獨(dú)立的文本文件來(lái)存儲(chǔ)這些信息, 比如說(shuō)student.txt 中的內(nèi)容是這樣:
第一行是表頭, 其他行是內(nèi)容,都用逗號(hào)分開(kāi) 。 
剩下的兩個(gè)文件的格式和這個(gè)差不多。 
 
編程工作進(jìn)展的非常順利, 最重要的部分無(wú)非就是用Pascal讀寫文件而已, 一周不到就完工了, 現(xiàn)在程序架構(gòu)是這個(gè)樣子的:
這個(gè)單機(jī)版的信息系統(tǒng)就這么運(yùn)行了起來(lái),效果還不錯(cuò)。
 
數(shù)據(jù)的冗余和不一致
商學(xué)院的主任聽(tīng)說(shuō)計(jì)科系有了這么一個(gè)系統(tǒng), 不由的也打起來(lái)注意, 輔導(dǎo)員就讓小李用軟盤拷貝了一份過(guò)去, 商學(xué)院也順利用來(lái)起了。
 
可是有些計(jì)科系的學(xué)生到商學(xué)院去選修經(jīng)濟(jì)學(xué)的課程時(shí), 發(fā)現(xiàn)還得再輸入一遍學(xué)生信息, 這實(shí)在是太煩人了。 
 
小李也沒(méi)辦法, 畢竟這是兩套系統(tǒng)啊, 只有采用土辦法, 把計(jì)科系的student.txt 復(fù)制了一份到商學(xué)院。 
 
這樣一來(lái)數(shù)據(jù)的重復(fù)難于避免了, 更有可能出現(xiàn)數(shù)據(jù)不一致的地方, 比如地址信息在計(jì)科系改了, 但是商學(xué)院沒(méi)改。 
 
后來(lái)輔導(dǎo)員說(shuō)數(shù)學(xué)系自己也搞了一個(gè)類似的系統(tǒng), 不是用Pascal而是用C寫的, 數(shù)據(jù)格式和小李定義的還不一樣, 小李想把Student.txt復(fù)制過(guò)去也不可能了。 
 
小李想要是學(xué)校所有的院系都用這么一套系統(tǒng)就好了。 其實(shí)學(xué)校領(lǐng)導(dǎo)也看到了這個(gè)問(wèn)題, 只是現(xiàn)在的校內(nèi)局域網(wǎng)還沒(méi)有建立起來(lái), 大家用同一套系統(tǒng)并不現(xiàn)實(shí)。
 
李氏查詢
到了期末, 計(jì)科系和商學(xué)院的老師紛紛給小李打電話:
“小李,我想統(tǒng)計(jì)一下這個(gè)學(xué)期操作系統(tǒng)課有哪些人沒(méi)及格, 多少人在80分以上, 你能幫忙弄弄嗎?”
 
“小李,我想算一下經(jīng)濟(jì)學(xué)的平均分, 能不能程序?qū)崿F(xiàn)一下? 學(xué)生太多,手工算太麻煩了 ”
......
 
為了應(yīng)付這些“變態(tài)”的需求, 小李假期幾乎沒(méi)怎么休息, 不停的用PASCAL寫各種各樣的功能。 
 
可是這種需求似乎無(wú)窮無(wú)盡, 總結(jié)一下,無(wú)非就是對(duì)這些文件的各種各樣的查詢而已。 
 
難道讓老師們直接去文件中查找和計(jì)算嗎? 顯然不行。  
 
小李想起了一句話: “ 所有計(jì)算機(jī)的問(wèn)題都可以通過(guò)增加一個(gè)中間層來(lái)解決” 
 
那提供一個(gè)中間層吧, 把文件層屏蔽掉, 讓老師們?cè)谶@個(gè)中間層用自己熟悉的術(shù)語(yǔ)進(jìn)行查詢。 
 
中間層上要有邏輯的數(shù)據(jù)結(jié)構(gòu),其實(shí)就是這些東西:
學(xué)生信息:[學(xué)號(hào),姓名,性別,入學(xué)日期,班級(jí),地址] 
 
課程信息:[課程號(hào),課程名,授課老師] 
 
選課 :[學(xué)號(hào),課程號(hào),成績(jī)]
 
小李決定把這些東西稱為“表” ,其中的每一項(xiàng)稱為“列”/“字段”/“屬性”, 每一列都有類型,例如字符型,日期型,數(shù)字型等等
 
查詢的話是用類似這樣進(jìn)行的: 
SELECT  學(xué)號(hào),姓名 
FROM 學(xué)生信息 
WHERE  入學(xué)日期='1991-9-1'
 
想把幾個(gè)表連接起來(lái)查詢也可以:
 
SELECT 學(xué)號(hào),姓名, 課程名,成績(jī)
FROM 學(xué)生信息 s , 課程信息 c, 選課 sc
ON s.學(xué)號(hào)=sc.學(xué)號(hào) AND c.課程號(hào)=sc.課程號(hào) 
WHERE   課程名='操作系統(tǒng)'  AND 成績(jī)<60 
 
很明顯小李需要寫一個(gè)解析器, 把這樣的語(yǔ)句變成內(nèi)部對(duì)文件的操作, 還好小李已經(jīng)有一點(diǎn)編譯原理的基礎(chǔ)了, 努力一下還是能寫出來(lái)的。
 
小李把查詢規(guī)則給各個(gè)老師做了個(gè)簡(jiǎn)單的培訓(xùn), 從此以后, 只要不是超級(jí)復(fù)雜的查詢, 老師們自己就搞定了,再也不用騷擾小李了。 
 
無(wú)心插柳柳成蔭,小李忽然發(fā)現(xiàn),自己的程序也可以調(diào)用這樣的抽象層來(lái)編程啊, 也不用直接操作文件了, 簡(jiǎn)化了好多。 
小李得意的把這套查詢稱為“李氏查詢” ,  李氏查詢用起來(lái)簡(jiǎn)便快捷, 最大的好處是用戶完全不用考慮物理層的那些文件的結(jié)構(gòu),只需要關(guān)注邏輯層的“表”就可以了。
 
(碼農(nóng)翻身注:其實(shí)就是SQL了)
 
可是小李一直是隱隱覺(jué)得不安, 不知道這種查詢方式有沒(méi)有漏洞, 后來(lái)看到埃德加·弗蘭克·科德 的論文 “A Relational Model of Data for Large Shared Data banks(大型共享數(shù)據(jù)庫(kù)的關(guān)系模型)”,
這才明白,其實(shí)這就是所謂的關(guān)系模型啊, 其背后的有著堅(jiān)實(shí)的數(shù)學(xué)基礎(chǔ), 肯定是沒(méi)有問(wèn)題的。
 
有了一個(gè)中間的邏輯層, 還帶來(lái)了一個(gè)額外的好處,現(xiàn)在小李可以對(duì)物理層的文件存儲(chǔ)做一些優(yōu)化了, 為了加快訪問(wèn)速度, 小李不再采用簡(jiǎn)單的逗號(hào)分隔的文件, 還增加了索引、B+樹(shù),緩存等手段。
由于有中間層的存在,這些變化對(duì)應(yīng)用層沒(méi)有什么影響。
 
 
接上篇《小李的數(shù)據(jù)庫(kù)之旅(上)》, 上回說(shuō)到小李用一個(gè)中間邏輯層解決了普通人也能查詢數(shù)據(jù)的問(wèn)題, 很快新的挑戰(zhàn)就來(lái)了。
 
并發(fā)訪問(wèn)
校園的局域網(wǎng)很快就建立起來(lái), 原來(lái)單機(jī)的軟件紛紛轉(zhuǎn)為支持網(wǎng)絡(luò)訪問(wèn)的系統(tǒng), 學(xué)校為了統(tǒng)一各系的信息系統(tǒng)管理, 要從現(xiàn)有的系統(tǒng)中擇優(yōu)選擇一個(gè),升級(jí)成局域網(wǎng)可訪問(wèn)的, 然后全校擴(kuò)展。
 
小李的軟件和數(shù)學(xué)系的,電子系的一起競(jìng)爭(zhēng), 相比而言,數(shù)學(xué)系的系統(tǒng)采用了網(wǎng)狀的結(jié)構(gòu), 電子系的采用了層次結(jié)構(gòu), 無(wú)論是哪種結(jié)構(gòu), 使用者都需要知道精確的內(nèi)部結(jié)構(gòu)以后才有可能進(jìn)行查詢, 相比“李氏查詢” 實(shí)在是太過(guò)繁瑣。  小李的系統(tǒng)以很大的優(yōu)勢(shì)勝出了。 
 
小李剛學(xué)會(huì)了C語(yǔ)言, 覺(jué)得這種語(yǔ)言更加貼近硬件,效率更高,更適合寫這些“系統(tǒng)級(jí)”的軟件, 于是決定保留之前的設(shè)計(jì), 然后用C重寫。  
 
當(dāng)然不僅僅是重構(gòu), 還包含了重要的功能增強(qiáng):網(wǎng)絡(luò)訪問(wèn), 從單機(jī)軟件變成了客戶端-服務(wù)器結(jié)構(gòu)(C/S)的軟件。
學(xué)校購(gòu)買了一個(gè)性能強(qiáng)勁的IBM服務(wù)器作為服務(wù)全校的中心數(shù)據(jù)節(jié)點(diǎn), 小李的軟件部署在了上面, 想著自己的軟件被這么多教職工使用, 小李覺(jué)得很有成就感。 
 
好景不長(zhǎng), 小李很快就發(fā)現(xiàn)網(wǎng)絡(luò)版軟件的復(fù)雜度要遠(yuǎn)遠(yuǎn)超過(guò)單機(jī)版, 這不馬上就有老師爆出了一個(gè)超級(jí)大問(wèn)題。
 
王老師對(duì)一個(gè)學(xué)生的地址進(jìn)行了更新, 張老師對(duì)另外一個(gè)學(xué)生的地址也做了更改, 后來(lái)發(fā)現(xiàn)王老師的修改不見(jiàn)了, 這是怎么回事? 
 
小李看了代碼,很快就發(fā)現(xiàn)在單機(jī)版的時(shí)候, 原來(lái)的操作都是基于整個(gè)文件的: 讀入文件內(nèi)容, 做修改, 然后寫入文件, 很明顯, 王老師的修改在前,張老師的修改在后, 王老師的被覆蓋了。 
 
真是個(gè)嚴(yán)重的問(wèn)題, 恰逢周末, 小李趕緊通宵達(dá)旦的修改, 升級(jí)系統(tǒng),把基于文件的操作改變成基于行的操作: 每個(gè)人的修改只影響這一行。 
 
小李覺(jué)得這樣應(yīng)該沒(méi)問(wèn)題了, 可是很快就發(fā)生了兩個(gè)人對(duì)同一行的修改: 
 
電子系的賬戶有1000元, 劉老師支取了300, 金老師支取了200 , 最后賬戶的余額竟然是800元 ! 實(shí)際應(yīng)該是500元啊。 
 
這是個(gè)極為嚴(yán)重的錯(cuò)誤, 系統(tǒng)被迫停止了幾天專門來(lái)修復(fù)這個(gè)問(wèn)題。 
 
一個(gè)解決的辦法就是給這一行加鎖, 在劉老師讀取了1000元, 扣除300元,并且把700 寫回到數(shù)據(jù)庫(kù)之前, 不允許金老師操作,這樣就不會(huì)亂掉了。
 
原子性問(wèn)題
小李找了幾個(gè)同學(xué),仔細(xì)的審查了程序,確保一些重要的更新操作都有行鎖, 這次稍微松了一口氣。 
 
可是一次非常偶然的系統(tǒng)故障有暴露了一個(gè)從沒(méi)有想過(guò)的大問(wèn)題:
 
當(dāng)時(shí)電子系的賬戶有1000元, 數(shù)學(xué)系有2000元,  電子系要給數(shù)學(xué)系轉(zhuǎn)賬200元, 系統(tǒng)先扣除了電子系的賬戶錢的錢,變成了800 , 正要往數(shù)學(xué)系上面增加余額的時(shí)候, 系統(tǒng)出了故障,崩潰了。 
 
重啟以后,就發(fā)現(xiàn)電子系的余額是對(duì)的, 可是數(shù)學(xué)系還是2000元, 那200元丟了 !
 
很明顯, 轉(zhuǎn)賬這個(gè)操作,必須得是原子的: 要么全部發(fā)生, 要么根本不發(fā)生。 
 
小李決定把類似這樣的操作叫做“事務(wù)”, 但是怎么實(shí)現(xiàn)呢?
 
小李苦思冥想, 終于放了一個(gè)大招: 記錄日志??! 
 
在做真正的操作之前,先把要做的事記錄下來(lái)形成日志(Log),這個(gè)日志中包括修改的數(shù)據(jù)項(xiàng)標(biāo)識(shí), 數(shù)據(jù)項(xiàng)的舊值(修改前的值)和新值(修改后的值), 然后再進(jìn)行真正的數(shù)據(jù)庫(kù)修改。   
 
剛開(kāi)始的時(shí)候事務(wù)處于活動(dòng)狀態(tài), 只有所有的操作都正確無(wú)誤的寫入了磁盤,才會(huì)進(jìn)入提交狀態(tài), 否則就要回滾修改。 
 
(碼農(nóng)翻身注: 除了原子性之外,事務(wù)還有持久性,隔離性,一致性,這里就不展開(kāi)了)
 
安全
 有一天系主任找到小李,提了一個(gè)全新的問(wèn)題:
“小李啊,能不能添加一點(diǎn)權(quán)限控制? 比方說(shuō)系里的財(cái)務(wù)狀況只能我和財(cái)務(wù)人員知道, 現(xiàn)在每個(gè)人都可以查詢,這成什么樣子?”
 
小李心想確實(shí)是這樣, 一個(gè)沒(méi)有權(quán)限控制的系統(tǒng)是非常危險(xiǎn)的, 尤其是隨意刪除, 那還了得?!
 
趕緊加上一個(gè)權(quán)限系統(tǒng), 小李想了想,  先定義三大類權(quán)限:
1. 對(duì)數(shù)據(jù)操作的, 例如SELECT, UPDATE, INSERT等
2. 對(duì)結(jié)構(gòu)操作的, 例如創(chuàng)建表,修改表,等
3. 做管理的, 例如備份數(shù)據(jù), 創(chuàng)建用戶等
 
然后就可以把這些權(quán)限授予某個(gè)用戶了, 很多時(shí)候,還需要把表附加上, 像這樣:
GRANT  SELECT on 財(cái)務(wù)表 to  系主任
GRANT  CREATE_TABLE to 張老師
 
(碼農(nóng)翻身注: 這里模仿了mysql
 
解決了如此多棘手的問(wèn)題以后, 小李的信息系統(tǒng)已經(jīng)非常復(fù)雜了,實(shí)際上,這個(gè)系統(tǒng)的中間層完全可以剝離出來(lái),形成一個(gè)完整的軟件了, 小李把它稱為:數(shù)據(jù)庫(kù)
 
 
丟失的數(shù)據(jù)
旺財(cái)是數(shù)據(jù)庫(kù)村的一個(gè)程序, 小強(qiáng)也是。
 
數(shù)據(jù)庫(kù)村有個(gè)特點(diǎn), 很多數(shù)據(jù)支持共享操作,多個(gè)程序可以同時(shí)讀寫,他們倆經(jīng)常會(huì)為了讀寫同一個(gè)數(shù)據(jù), 爭(zhēng)奪的不可開(kāi)交。
 
這一天,當(dāng)旺財(cái)和小強(qiáng)對(duì)同一個(gè)銀行賬戶A進(jìn)行寫操作時(shí)候, 出現(xiàn)了這么一個(gè)錯(cuò)誤:
看看, 本來(lái)旺財(cái)要加上的20元就丟掉了。  
 
同樣的事情發(fā)生的多了, 他倆給這種情況起了一個(gè)名字,叫“丟失修改”, 其實(shí)說(shuō)白了就是倆人都去寫一個(gè)數(shù)據(jù), 一個(gè)人的數(shù)據(jù)把另外一個(gè)給覆蓋了。
 
村里的Mysql說(shuō): “你們兩個(gè)小家伙,寫數(shù)據(jù)的時(shí)候連加鎖都不做,肯定會(huì)出大亂子!"
 
旺財(cái)說(shuō):“加什么鎖?”
 
“來(lái)來(lái)來(lái), 我教你們一個(gè)排他鎖(Exclusive Lock) ,   簡(jiǎn)稱X鎖, 旺財(cái)你要寫數(shù)據(jù)了, 就把它用X鎖鎖住, 鎖住后,除非你釋放, 否則小強(qiáng)無(wú)法獲得X鎖。 這不就解決你們的問(wèn)題了?  ”
 
小強(qiáng)想了想, 就把上面的操作過(guò)程用X鎖改了一下:
旺財(cái)說(shuō):“果然不錯(cuò), 確實(shí)可以解決兩個(gè)人同時(shí)修改導(dǎo)致的問(wèn)題?!?/span>
 
臟數(shù)據(jù)
小強(qiáng)說(shuō):“旺財(cái), 我們約定,寫數(shù)據(jù)的時(shí)候都用X鎖吧?”
 
旺財(cái)說(shuō): “這沒(méi)問(wèn)題, 可是X鎖只在寫數(shù)據(jù)的時(shí)候用, 我們讀數(shù)據(jù)是不用加鎖的, 我想起了一種情況, 你看看怎么辦?”
小強(qiáng)在旺財(cái)執(zhí)行的途中讀了A的值, 但是旺財(cái)把對(duì)A的修改給回滾(Rollback)了, 這下小強(qiáng)尷尬了, 他讀到了臟數(shù)據(jù)。
 
“要不我們?cè)谧x取數(shù)據(jù)的時(shí)候也加個(gè)X鎖 ? ” 小強(qiáng)說(shuō)。
 
“那樣太嚴(yán)格了, 就是讀一個(gè)數(shù)據(jù)啊, 值得嗎?”
 
“這樣吧, 我們?cè)俑阋粋€(gè)新的鎖出來(lái), 專門用于共享數(shù)據(jù)的讀取, 就叫共享鎖(Share lock) ,簡(jiǎn)稱S鎖, 這個(gè)鎖和之前的排他鎖X鎖有區(qū)別, 主要用于讀取數(shù)據(jù),  如果一個(gè)數(shù)據(jù)加了X鎖, 就沒(méi)法加S鎖, 同樣加了S鎖, 就沒(méi)法加X(jué)鎖”   小強(qiáng)想出了一個(gè)點(diǎn)子。
 
“那如果我加了S鎖, 你還能加S鎖嗎? ”  旺財(cái)問(wèn)。
 
“應(yīng)該可以吧,  咱們倆都是讀數(shù)據(jù), 互不影響啊。 還有為了防止長(zhǎng)時(shí)間的鎖住, 我們可以約定一下,不管我們要做的事情有多少, 讀一個(gè)數(shù)據(jù)之前加S鎖, 讀完之后立刻釋放該S鎖 ! ”
果然,這樣一來(lái)“臟數(shù)據(jù)”的問(wèn)題就解決了 !
沒(méi)法重復(fù)讀?
旺財(cái)和小強(qiáng)兩個(gè)程序相安無(wú)事了很久, 但是S鎖在讀完數(shù)據(jù)后立刻釋放的約定, 導(dǎo)致出了一個(gè)新問(wèn)題。
 
旺財(cái)在一次數(shù)據(jù)處理中, 先讀取了A和B的值, 相加得到了150 ,  然后小強(qiáng)把B改成了30
旺財(cái)再次讀取A和B, 發(fā)現(xiàn)求和以后是130 , 剛才的不一樣了!
(碼農(nóng)翻身注: 假定旺財(cái)?shù)奶幚硎窃谝粋€(gè)事務(wù)當(dāng)中)
旺財(cái)說(shuō): “小強(qiáng),  我在讀取數(shù)據(jù)的時(shí)候你不能改啊 , 要不然我這里會(huì)出現(xiàn)不一致, 你看剛開(kāi)始是A+B是 150, 現(xiàn)在變成130了”
 
小強(qiáng)說(shuō): “我們之前的約定是讀數(shù)據(jù)時(shí)加S鎖, 讀完立馬釋放,  問(wèn)題就出現(xiàn)在這里了。”
 
“看來(lái)在讀數(shù)據(jù)的時(shí)候, 也需要一直鎖定了, 直到事務(wù)提交?!?/span>
 
 
幻覺(jué)出現(xiàn)
旺財(cái)和小強(qiáng)現(xiàn)在已經(jīng)能靈活的使用X鎖和S鎖了。
他們倆總結(jié)了一下, 分為了這么幾種情況:
 
1.  寫數(shù)據(jù)時(shí)加上X鎖,直到事務(wù)結(jié)束, 讀的時(shí)候不加鎖。
雖然能夠避免丟失數(shù)據(jù),  但是可以讀到?jīng)]有提交或者回滾的內(nèi)容 (臟數(shù)據(jù)), 這其實(shí)就是數(shù)據(jù)庫(kù)最低的事務(wù)隔離級(jí)別 --- Read uncommitted
 
2. 寫數(shù)據(jù)的時(shí)候加上X鎖, 直到事務(wù)結(jié)束,  讀的時(shí)候加上S鎖, 讀完數(shù)據(jù)立刻釋放。
這能避免“丟失數(shù)據(jù)”和“臟數(shù)據(jù)”,  但是會(huì)出現(xiàn)“不可重復(fù)讀”的問(wèn)題  ,  這是第二級(jí)的事務(wù)隔離級(jí)別 -- Read committed
 
3.  寫數(shù)據(jù)的時(shí)候加上X鎖,  直到事務(wù)結(jié)束, 讀數(shù)據(jù)的時(shí)候加S鎖, 也是直到事務(wù)結(jié)束。
這能避免“丟失數(shù)據(jù)”和“臟數(shù)據(jù)”, “不可重復(fù)讀”三個(gè)問(wèn)題 , 這是數(shù)據(jù)庫(kù)常用的隔離級(jí)別 --
Repeatable read
 
整個(gè)世界似乎清凈了。
 
有一次旺財(cái)對(duì)一個(gè)“學(xué)生表”進(jìn)行操作,選取了年齡是18歲的所有行, 用X鎖鎖住, 并且做了修改。
 
改完以后旺財(cái)再次選擇所有年齡是18歲的行, 想做一個(gè)確認(rèn), 沒(méi)想到有一行竟然沒(méi)有修改!
這是怎么回事?  出了幻覺(jué)嗎?
 
原來(lái)就在旺財(cái)查詢并修改的的時(shí)候,  小強(qiáng)也對(duì)學(xué)生表進(jìn)行操作, 他插入了一個(gè)新的行,其中的年齡也是18歲!  雖然兩個(gè)人的修改都沒(méi)有問(wèn)題, 互不影響, 但從最終效果看, 還是出了事。
 
(碼農(nóng)翻身注: 正是小強(qiáng)的操作, 讓旺財(cái)出現(xiàn)了“幻讀”)
 
旺財(cái)說(shuō): “沒(méi)轍了, 我們倆非得串行執(zhí)行不可, 你必須得等我執(zhí)行完。 ”
 
這就是數(shù)據(jù)庫(kù)事務(wù)隔離級(jí)別的終極大招:Serializable
 
最后, 為了方便記憶, 他們倆倒騰了半天, 整出了一張表, 用于記錄各種情況:
(點(diǎn)擊看大圖)
 
兩個(gè)人看著這張表, 感慨的說(shuō):“唉, 這數(shù)據(jù)庫(kù)村的事務(wù)隔離級(jí)別可真是不容易?。 ?/span>
 
Mysql 不屑一顧的說(shuō): “這都嫌麻煩了, 你們還沒(méi)遇到死鎖呢....”
微信公眾號(hào)【黃小斜】作者是螞蟻金服 JAVA 工程師,專注于 JAVA 后端技術(shù)棧:SpringBoot、SSM全家桶、MySQL、分布式、中間件、微服務(wù),同時(shí)也懂點(diǎn)投資理財(cái),堅(jiān)持學(xué)習(xí)和寫作,相信終身學(xué)習(xí)的力量!關(guān)注公眾號(hào)后回復(fù)”架構(gòu)師“即可領(lǐng)取 Java基礎(chǔ)、進(jìn)階、項(xiàng)目和架構(gòu)師等免費(fèi)學(xué)習(xí)資料,更有數(shù)據(jù)庫(kù)、分布式、微服務(wù)等熱門技術(shù)學(xué)習(xí)視頻,內(nèi)容豐富,兼顧原理和實(shí)踐,另外也將贈(zèng)送作者原創(chuàng)的Java學(xué)習(xí)指南、Java程序員面試指南等干貨資源
重新學(xué)習(xí)MySQL數(shù)據(jù)庫(kù)開(kāi)篇:數(shù)據(jù)庫(kù)的前世今生
添加描述
向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI