
在鼴鼠王國,最重要的就是「食物儲藏室」。為了好好管理王國內有多少食物庫存,鼴鼠國王制定了一套嚴格的規則,讓那些要看儲藏室有多少食物、放食物到儲藏室、或者從儲藏室拿食物的鼴鼠們,都能夠好好地完成任務。
1. 鼴鼠管理條例:ACID 基本介紹
每當一隻鼴鼠要到儲藏室執行「領取任務」時,必須保證四件事:
- 原子性 (Atomicity):你要登記了拿幾隻蚯蚓,就該把這些蚯蚓全部搬回洞穴,不然就一條都別搬。絕對不能發生「登記好拿了兩條,結果一條手滑掉在儲藏室忘記拿」這種帳目不對的情況。
- 一致性 (Consistency):搬運前後,鼴鼠王國中的蚯蚓總數必須是守恆的,儲藏室不會也不能憑空多出或少掉蚯蚓。
- 隔離性 (Isolation):執行不同「搬運任務」的鼴鼠在搬蚯蚓時,有神秘的遮罩,讓鼴鼠們互不干擾。
- 持久性 (Durability):一旦鼴鼠領完蚯蚓,並在門口的白板上紀錄了「領取成功」,就算等一下地底淹大水,這筆紀錄也永遠有效。
2. 混亂的併發問題與「隔離層級」
鼴鼠王國有1莫耳的鼴鼠(1 mole of moles),當如此大量的鼴鼠同時湧入儲藏室領蚯蚓,如果沒有良好的防護機制,就會發生靈異事件:
三大併發難題
- 髒讀 (Dirty Read):鼴鼠小鼴看到鼴鼠小鼠都在同一間儲藏室裡要拿蚯蚓,這間儲藏室有10條蚯蚓,小鼴看到小鼠正要把5條蚯蚓放進箱子(還沒寫上白板做最後確認),小鼴就以為這間儲藏室的蚯蚓剩5條。結果小鼠突然反悔把蚯蚓放回去,小鼴會一直以為儲藏室剩5條蚯蚓,而不是真實的10條,他讀到的是虛假的資訊!
- 不可重複讀 (Unrepeatable Read):鼴鼠小鼴在儲藏室裡數了兩次蚯蚓數量,第一次有 5 條,一眨眼的時間,鼴鼠小鼠默默領走了 3 條。小鼴第二次數變成了 2 條。小鼴嚇呆了,我都沒有領,為什麼蚯蚓數量變了!?
- 幻讀 (Phantom Read):鼴鼠小鼴數了編號 1至編號10 的儲藏格分別有 10 條蚯蚓,共 100 條。結果鼴鼠小鼠在小鼴數蚯蚓的期間,偷偷在中間挖了一個新格子塞入 1 條(insert)。結果小鼴再數一次,發現突然多出了 1 條蚯蚓,共 101 條,真的是見鬼啦!
由輕到重的四種隔離防護(Isolation Levels)
- 1. 讀未提交 (Read Uncommitted) ——「毫無防備的木門」
- 規則: 鼴鼠可以看到別人「正在搬、還沒登記完成」的蚯蚓。
- 防護力: 最低。
- 併發問題: 會發生髒讀 (Dirty Read)。你可能會讀到其他鼴鼠最後「反悔不領了」的虛假資料。
- 2. 讀已提交 (Read Committed) ——「確認過的門簾」
- 規則: 鼴鼠只能看到別人「已經登記完成」的蚯蚓。
- 防護力: 中等。這是許多資料庫(例如,SQL Server, PostgreSQL)的預設等級。
- 併發問題: 雖然防住了髒讀,但會發生不可重複讀 (Unrepeatable Read)。如同先前小鼴遇到的情況,當在同一個任務裡數兩次,數量可能會因為別人剛好領走或反悔而變動。
- 3. 可重複讀 (Repeatable Read) ——「加鎖的鐵門」
- 規則: 只要有鼴鼠進入儲藏室開始任務,直到你出來前,你看到的蚯蚓數量都會被鎖定。
- 防護力: 高。這是 MySQL (InnoDB) 的預設等級。
- 併發問題: 防住了髒讀和不可重複讀,但在某些情況下仍可能發生幻讀 (Phantom Read)(有鼴鼠偷偷在儲藏室挖新格子)。
- 4. 可序列化 (Serializable) ——「具有自動鎖的鐵門」
- 規則: 一間儲藏室只有一隻鼴鼠能夠進入,所有的鼴鼠必須排隊。儲藏室內的鼴鼠沒搬完,下一隻鼴鼠連「看」都不行。
- 防護力: 最高。
- 併發問題: 解決所有併發難題(包含幻讀)。
- 代價: 效能最低,面對 1 莫耳鼴鼠時,排隊的鼴鼠大部分都會因為來不及領到蚯蚓而餓死。
3. 鎖的介紹:門牌防禦系統
為了實踐隔離防護,鼴鼠們發明了三種顏色的掛牌:
- 🟢 綠鎖 (S 鎖 - 共享鎖):大家可以同時在儲藏室的門口掛綠牌。意思是「我只是進來數數看,你也進來一起看吧,但不能動到儲藏室內的蚯蚓!」
- 🔴 紅鎖 (X 鎖 - 排它鎖):我要拿一些蚯蚓!當有鼴鼠掛上紅牌後,任何鼴鼠都不能進來(不能看、也不能改)。
- 🟡 黃鎖 (Gap 鎖 - 間隙鎖):我不只鎖住我正在數的儲藏格,還會「鎖住格子之間的空隙」。這樣就沒人能在這些儲藏格之間偷偷挖新格子,完美解決幻讀問題。
悲觀 vs 樂觀:鼴鼠國王的態度
- 悲觀鎖:鼴鼠國王總覺得有人會偷吃蚯蚓!一進門就先掛紅鎖,所有人外面等著。
- 樂觀鎖:鼴鼠國王覺得大家很守規矩。不掛門牌,但出門時要核對門框旁的「號碼牌(版本號)」。如果號碼牌變了,代表有人動過,當事鼴鼠這次的領取要作廢重來!這就是為什麼使用樂觀鎖時,系統可能會跳出「資料已被其他使用者修改,請重新整理後再試」的訊息。
4. 恐怖的「死鎖 (Deadlock)」
這是鼴鼠王國最怕的庫存管理意外。
情境:鼴鼠 A 佔住了 1 號儲藏室,並掛上紅牌(X 鎖),且準備伸手去拿 2 號儲藏室的鑰匙,同時鼴鼠 B 佔住了 2 號儲藏室,同樣掛上紅牌(X 鎖),且準備伸手去拿 1 號儲藏室的鑰匙。
結果:兩隻鼴鼠互不相讓,因為目標儲藏室都被掛上紅牌,兩隻鼴鼠都拿不到鑰匙,永遠僵在那裡。
解決辦法:鼴鼠國王規定「所有人必須先鎖小號碼,再鎖大號碼」,使得排隊機制啟動: 雖然鼴鼠 B 想要開的是 2 號儲藏室,他也得先去 1 號儲藏室前面等,鼴鼠 B 來到 1 號門口,發現鼴鼠 A 已經掛了紅牌,所以鼴鼠 B 只能乖乖在 1 號門外等待,牠根本還沒機會去鎖 2 號,並且由於 2 號儲藏室是空的!鼴鼠 A 順利地走過去 2 號儲藏室並掛上紅牌開始搬運任務。
或者,可以派一名巡邏員,當發現兩隻鼴鼠互不相讓的死鎖時,忍痛把其中一隻鼴鼠踢出去(Rollback),讓另一隻先完成。
5. 結語:從地底規則到數位世界的秩序
這套嚴密的「儲藏室管理條例」,正是鼴鼠王國能夠保持蚯蚓帳目清清楚楚的秘訣。
從確保任務「全有或全無」的 ACID 管理條例,到應對靈異現象(髒讀、不可重複讀、幻讀)的 隔離層級,再到避免鼴鼠們相撞的 紅綠門牌(鎖機制),我們學到的不只是鼴鼠王國的生存規則,更是現代網路世界(例如,搶票系統、銀行轉帳、電商庫存)穩定運行的核心基石。
身為鼴鼠王國的專業儲藏室管理員,你需要記住以下準則:
- 安全與速度的權衡:隔離層級越高,資料越安全,但排隊的鼴鼠就越多。
- 預防勝於治療:透過「先小後大」的鎖順序規律,可以讓死鎖消失於無形。
- 心態決定工具:在衝突少的區域用「樂觀號碼牌」,在競爭激烈的熱點用「悲觀紅鎖」。
不論未來鼴鼠王國如何擴張,只要好好遵守「儲藏室管理條例」,即便面對再多「領取任務」,鼴鼠王國的財富(蚯蚓)也永遠不會出錯!
但是!鼴鼠王國有1莫耳的鼴鼠耶,這樣要多少儲藏室才夠用?
事實上,當鼴鼠數量多到這個地步,再完美的「管理條例」也會遇到瓶頸。這就是為什麼現代的鼴鼠王國不再只依賴一間巨大的儲藏室,而是開始實施:
- 水平分片 (Sharding):把蚯蚓分散到成千上萬間小儲藏室。
- 讀寫分離:讓「數蚯蚓」和「拿蚯蚓」的鼴鼠走不同的門。
下一步我們將研究如何擴張王國的版圖,一起為鼴鼠王國的榮耀努力吧!鼴鼠!鼴鼠!鼴鼠!YEAH!

















