歡迎來到客戶端-伺服器數據庫!
在本章中,我們將探討大型數據庫如何同時處理成千上萬名使用者的需求。無論是你正在預訂演唱會門票,還是查看銀行餘額,你都在使用客戶端-伺服器數據庫 (Client-server database)。我們將學習這些系統的運作原理,以及更重要的一點:當所有人同時按下「儲存」按鈕時,它們是如何防止數據變得混亂的。如果一開始覺得這些概念有點技術性,別擔心,我們會把它拆解成容易理解的小部分!
1. 什麼是客戶端-伺服器數據庫?
在簡單的數據庫中,可能只有一個人會在電腦上使用一個檔案。但在現實世界中,許多人需要同時查看並修改相同的資訊。客戶端-伺服器數據庫系統能夠為多個客戶端 (multiple clients) 提供對中央數據庫的同步存取 (simultaneous access)。
把它想像成一間專業的廚房: 伺服器 (Server) 就像行政總廚,留在廚房裡管理儲藏室(數據庫)。客戶端 (Clients) 就像服務生(應用程式或使用者),他們送出食物訂單(請求)。多個服務生可以同時送出訂單,而總廚必須確保儲藏室不會在沒人注意的情況下耗盡食材!
重點複習:
• 客戶端 (Client): 發出數據請求的應用程式或使用者。
• 伺服器 (Server): 儲存數據庫並處理請求的強大電腦。
• 同步存取 (Simultaneous Access): 許多人同時使用同一個數據庫。
2. 問題所在:並發存取 (Concurrent Access)
當多個使用者在完全相同的時間試圖更改同一筆數據時,這被稱為並發存取。這會導致一個著名的問題,稱為遺失更新 (lost update)。
想像一下這個情境:
1. 使用者 A 和使用者 B 都看到網店剩下最後 1 雙鞋。
2. 使用者 A 按下「購買」。他們的電腦顯示「原本有 1 雙,現在變成 0 雙」。
3. 在同一微秒內,使用者 B 也按下「購買」。他們的電腦同樣看到原本有 1 雙,所以也顯示「原本有 1 雙,現在變成 0 雙」。
4. 兩次更新都被儲存了。商店賣出了 2 雙鞋,但庫存只有 1 雙!其中一個更新「覆蓋」了另一個,從而導致了遺失更新。
關鍵結論: 若沒有管理並發存取的方法,數據庫就會失去其完整性 (integrity)(變得不準確且不可靠)。
3. 如何管理並發存取
為了確保數據安全,伺服器必須使用「並發控制」。AQA 考試大綱要求你掌握以下四種主要方法:
方法 A:記錄鎖定 (Record Locking)
這是最常用的方法。當使用者開始編輯一個記錄 (record)(表格中的一行)時,伺服器會將其「鎖定」。在該使用者完成之前,沒有其他人可以編輯那條記錄。
比喻:這就像公廁的隔間。一旦你進去並鎖上門,在你離開之前,沒有其他人可以進來。
風險:死鎖 (Deadlock)
有時候,使用者 1 鎖定了記錄 A,並等待記錄 B;與此同時,使用者 2 鎖定了記錄 B,並等待記錄 A。他們兩人都會永遠卡住!這就稱為死鎖。
方法 B:序列化 (Serialisation)
序列化確保交易是按順序處理,而不是重疊進行的。即使請求幾乎在同時到達,伺服器也會強迫它們進入隊列,這樣第二個交易只有在第一個交易完全完成後才能開始。
方法 C:時間戳順序 (Timestamp Ordering)
每次交易開始時,都會獲得一個時間戳 (timestamp)(它到達的確切時間)。如果有兩個使用者試圖更改相同的數據,伺服器會查看時間戳,時間較早的人優先。如果一個較晚的交易試圖存取一個較早的交易正在使用的數據,系統通常會通知較晚的交易等待或重新啟動。
比喻:就像在熟食櫃檯拿號碼牌一樣。無論你喊得多大聲都沒用,號碼最小的人會先被服務。
方法 D:提交順序 (Commitment Ordering)
這種方法會檢視整個「交易」,並根據它們對彼此的影響,決定儲存(提交)它們的最佳順序。它確保如果一個交易依賴於另一個交易,它們會以不違反數據庫規則的順序完成。
你知道嗎?
在高速銀行系統中,這些決定是在毫秒內完成的!數據庫管理員必須選擇正確的方法,以平衡速度與安全性。
總結與記憶小撇步
要記住控制並發存取的四種方法,只需記住 L.S.T.C.:
L - 記錄鎖定 (Record Locks)
S - 序列化 (Serialisation)
T - 時間戳順序 (Timestamp Ordering)
C - 提交順序 (Commitment Ordering)
記憶口訣: "Large Servers Treat Clients"(大型伺服器對待客戶端)
考試重點:
• 客戶端-伺服器數據庫允許多位使用者同時使用。
• 並發存取會導致遺失更新(造成數據完整性問題)。
• 記錄鎖定防止他人在記錄「使用中」時進行編輯。
• 序列化、時間戳順序與提交順序是保持數據井然有序且安全的替代方案。