網際網路與資料庫的對話錄
[ 目錄 ] / [ 本節目錄 ] [ 上一篇 ] [ 下一篇 ]


第八章、交易處理與並行性問題

陳尚寬

2002/06/18


第一節、資料並行性與資料一致性

星期六下午,小君約小博在忠孝東路四段的崇光SOGO百貨公司前的地鐵站出口處見面,而且要不見不散喔。可是這句話真會害死一個老實的人—小博,明明是約定二點鐘,小博怕忠孝東路塞車會遲到,特別搭捷運提前五分鐘抵答約定的地點等待,一秒一分逐漸地過去了,就是還沒有看到小君的人影,連個電話鈴聲也沒有影,真是等死人了。等到快三點鐘,小博打電話到小君的手機,響了幾百聲,沒人接就是沒人接,快要氣死人了。四點鐘一到,小博本來要走人不等了,沒想到才稍一轉身,就聽到背後出現了一個熟悉的聲音在呼喊著他,小博心不甘情不願地回頭看看是誰,沒錯,就是讓他等了整整二個小時的小君終於現身在他的面前了,只見她上氣不接下氣,斷斷續續地說著一些抱歉之類的話語。小博心想—人來了就好,人來了就好,誰叫我和他同學七年呢。小君知道今天實在是太對不起小博,為了瀰補他苦苦的等待,她撒嬌地說:「這個月薪水又下來了,我準備去銀行領點錢出來,晚上陪我去百貨公司逛逛吧,我請你吃頓飯。」

小博又好氣又好笑地說:「多謝啦,一拿到錢就想把它花掉,這樣不太好吧。」

小君瞪了小博一眼,覺得這個人怎麼會這樣囉唆呢!人家好心要請他吃晚餐,非但連個謝謝也沒有聽到,還指責人家浪費,不懂得節制,真是枉費本姑娘的一番心意。只見小君嘟著嘴說:「都累了一整個月了,享受成果有甚麼不對。你也真囉唆ㄟ,小博哥哥。」

小博明明知道自己說得沒錯,可是在小君的面前,黑的不一定就是黑的,完全要看小君的心情而定,他連忙改口說:「對,開心就好,不過要有所克制喔。」

看到小博的態度一百八十度的大轉變,小君知道她又贏了這場爭戰,本來屈居於下風的她如今已經成功地佔據制高點,成為二個人之間負責發號司令的人:「我會的,對了,說到去銀行領錢,我有時覺得資金的進進出出,好像也跟資料庫有點關係耶。」

小博和小君相處的時候,平時都被小君吃得死死的,只有在談論電腦方面的專業話題時,小博才有辦法令小君服服貼貼的,比如現在就是一個最佳的實例。小博摸一摸鼻子,邊走邊說說:「算妳懂得融會貫通,資金的進進出出,就很像資料庫不斷更新的動作,妳想看看,一天有多少人在銀行帳戶裡提款與存款,如果同一時間有多個人要存款與提款,妳想銀行裡總金額會不會大亂。」

小君不多想,馬上隨口回應小博的問題:「初步想一想,的確會有問題,大家要一起對銀行總金額作修改,又不能讓客戶等,又要維持總金額正確,好像真有其困難度,但是似乎很少聽說有甚麼銀行出現這樣的問題的啊。」

小博一句話點出這個問題的基本特性:「那是因為銀行的系統可以同時做到了資料的並行性與資料的一致性。」

果然小博的答案吸引了小君的注意,小君停止注意騎樓旁邊服飾連鎖店中各式各樣新上櫃的衣服,專心思考小博說的觀念,小君在消化小博給的東西後,嘗試用自己的話說出來:「資料的並行性是不是允許多人同時對資料庫作修改,而資料的一致性是不是這些並行動作的前後結果,必須與一個一個照順序的做,所得到的結果必須要一樣呢?」

小君興高采烈地說著,完全沒有注意到四週的行人,眼見就要撞上迎面而來的行人了,小博趕緊拉她一把,免得撞個正著。他一邊拉著小君一邊說:「沒錯,就是這樣。妳蠻有概念的嘛。」

小君本來還以為小博要對她做什麼,後來往旁邊看過去,發現有一個行人邊走邊瞪她,還嘴中唸唸有詞,依稀聽到—長這麼大了,走路還不長眼睛—之類的話,小君這時才明白她剛剛誤會小博了,雖然覺得很抱歉,但又好像有一丁點兒的失落,說不上來是為了什麼。小君轉頭說:「當然囉,我的工作可是對錢的進進出出必須要非常的了解呢。」

小博差點當了好人還錯被當成壞人打,實在是得不償失。雖然如此,他還是很專心地和小君進行討論:「那你知道一筆交易必須要有哪些特性嗎?」

小君當然是「莫宰羊」囉,就算要猜,也實在不知道要從何猜起。因此小君直接了當地對小博說:「這這這,嗯,還是由你來說比較好吧。」

看到小君如此謙虛,小博也就當仁不讓,馬上接手說:「第一個叫做:不可分割性。通常一個交易可能會包含了很多資料庫的動作,而整個交易必須看成不可分割的單元,也就是說整個交易過程必須全部做完,如果說再交易過程中發生了甚麼突發狀況,就要把整個狀態歸回到尚未執行這次交易的原點。」

小君覺得肚子有點咕嚕咕嚕地叫著,又聽到這麼一大串又臭又長的解釋,當下受不了,趕緊叫小博再繼續解釋:「聽的頭和肚子都有點發昏,你就舉個生活化的例子來說說吧。」

小博:「例如啊,妳待會要去自動提款機領錢,這領錢的過程就是一個交易過程,可以再細分為兩個部分,第一部分是銀行會先從妳的帳戶扣款,而第二部分就是自動提款機會把你所要提出的金額如數地出現在妳的面前,對不對呀?」

小君天生對抽象的東西總是較沒折,如果要教會她一些東西,最好的辦法就是多舉一些實際的例子。小博才剛說明完這個例子,小君不僅已經瞭解了,還能夠馬上舉一反三,進行延伸性的解釋:「對嘛,你這樣說我就懂了,早說嘛!是不是如果戶頭裡面的錢不夠的話,就會無法完成整個交易的動作,也就是說整個交易就會被取消,而我的帳戶的錢也就回歸到尚未執行交易那時候的數字囉。」

小博繼續說明交易的第二個特性:「嗯,沒錯,這就是不可分割性。接下來我要告訴妳的就是:一致性。」

小君有點心不在焉地說:「這很容易了解啊,是不是在交易的處理前後,必須使得資料庫處裡的狀態要一致呢?不過在交易的過程中也需要一致嗎?」

小博敲敲小君的頭,要她多專心一點,不要老是偷瞄路旁的專櫃服飾店。他搖搖頭說:「妳問的很好,答案是否定的。舉個例子來說好了,假如今天A先生想要轉帳一萬塊錢給B先生,整個交易包含有兩個步驟,第一,銀行先從A先生的帳戶扣款一萬元,然後將一萬元存到B先生的帳戶去。在交易前A先生與B先生帳戶的總額應該要與交易後A先生與B先生帳戶的總額,然而妳觀察到交易過程中兩位先生的帳戶總額了嗎?」

小君「ㄜ」了一聲,也回敲了一下小博的頭額,由於小博比小君高約20公司左右,所以小君每次要敲小博的頭時,除非是小博坐著,否則都一定要跳起來才敲得到。小君意猶未竟地看了看拳頭後說:「我瞭解了,因為那時扣了A先生的錢,卻尚未將錢存入B先生的帳戶去,所以有不一致的情形了。」

小博很滿意小君的回答,他接續著進行下一個特性的說明:「非常好,那我再繼續介紹第三個特性:孤立性。」

小君又再次跳起來重重地敲了一下小博的頭,看她玩得不亦樂乎、好不開心的模樣,真難想像她平時在公司裡一付安靜穩重的樣子。她兇兇地說:「孤立性?真得有點難以想像ㄋㄟ。」

小博用雙手保護著頭頂,避免再度受到小君的攻擊與搗蛋。一邊閃躲著天外飛來的拳頭一邊說:「其實孤立性的觀念並不難,講了妳就知道了。孤立性就是,任何交易的中間結果都是該被孤立的,也就是說其他的交易是不得讀取或是加以更改。如此可以確保當該交易不幸被取消而重來時,被取消的中間過程不會被其他交易所讀取,而造成嚴重的錯誤。」

小君看到一個塊頭這麼高大的人,被自己欺負成這樣子,有時真懷疑自己到底是不是女生呢?還是仗勢著是女生,男生不敢怎麼樣,所以就特別的兇悍呢?再側眼看了一下小博,到底自己是怎樣看待這個人呢?是把他當成同學呢?朋友呢?還是…唉!現在還是不要想這些煩人的事了,先把眼前的問題一一解決了再說吧:「這樣講我就瞭解了,是不是說,如果我今天想從我的戶頭提個五千塊,而同時公司要匯三萬塊的薪水給我,假設我的提款動作先執行,那麼公司的匯款動作就要等我的提款動作都完成了才能夠執行囉。」

小博點點頭又搖搖頭,點頭是因為前面說對了,搖頭是因為後面說得不太對,有些地方還需要修正。他更正小君的話:「不過妳只講對了一半,因為從公司扣三萬塊的動作是可以同時執行的,並不需要等待妳的提款動作完成的。」

小君玩歸玩,可沒忘記聽小博在說些什麼,小博話一講完,她就知道自己錯在那裡了,馬上更正自己剛剛說過的話:「我知道了,因為處理的是不同戶頭,所以同時做不會產生問題,又可以增快處理速度,對吧?」

小博一面點點頭,一面注意綠燈亮了沒,因為最近忠孝東路上的紅綠燈損壞的頻率非常高,時常碰到行人與汽車在斑馬線處亂成一團。還好,這個十字路口的紅綠燈是OK的,他可以安心地等待綠燈了。他轉頭對小君說:「沒錯,我相信妳真的懂了。接下來,我再來介紹最後一個特性:也就是延續性。這個特性是說,如果交易過程完全正常,而且交易的結果也被確認無誤,那麼將來系統就算發生錯誤,經排除後,交易的結果仍然必須存在。」

小君才剛開始要回應第四個特性,小博就急忙地拉著她的手匆匆地越過馬路,她只好一邊跟著小博過馬路一邊說:「嗯,我覺得這是一個應該要有的性質,不然如果事後系統當機,我們戶頭裡面的錢就這樣『咻』地不見了,那還有誰敢存錢在銀行裡呢。」

第二節、資料的鎖定

過了馬路後,小博放開小君的手,才繼續回應她在過馬路時說的話:「剛剛提到說,妳存錢到戶頭裡,而同時公司匯錢給妳,這時候,當妳在做存錢的動作時,系統其實是對妳的戶頭做一個鎖定的動作。」

剛剛的那條馬路還真寬,為了和小博一同穿越馬路,小君三步併成二步跑,差點快上氣不接下氣,喘不過來了。抵達馬路對面後,小博又「劈哩啪啦」地講了一堆話,說得小君「頭昏昏,腦盾盾」的聽不懂他在說蝦米,只好猜測他話中的涵意:「鎖定的動作?是不是為了避免不必要的干擾,而使得戶頭的金額發生錯誤。」

小博在人行道上停了下來,讓小君喘口氣,休息一下,順便想想要去那兒提領錢。他一面扶著小君一面說:「是的,這也就是銀行資料庫中,有關妳的戶頭資料先暫時性的鎖定。一般而言,鎖定可以分為兩種。」

獲得休息機會的小君,馬上從背包裡拿出一瓶水,一邊大口大口地喝,一邊「嗚嚕嗚嚕」發音不清楚地問著:「到底是那兩種啊?」

小博暗示小君不要喝得那麼快,否則很容易氣岔的,只見他瞪大了眼睛,用表情威嚇小君,要小君從善如流。小君看到「架恐怖」的表情,差點真得笑岔,連忙停止繼續喝水。小博看到自己嚴厲的表情非但沒有作用,還可能幫倒忙,覺得十分失望,於是垂頭喪氣地說:「讓我慢慢地告訴妳,第一個是互斥鎖定,也就是剛剛的例子,因為兩筆交易必須更改同一戶頭,為了不發生錯誤,最先獲得處理這個戶頭的交易,便先鎖定此戶頭,當處理結束後才釋放鎖定。」

小君將水壺蓋鎖緊,放回背包裡,然後打了一個嗝後才意猶未境地說:「喔,原來這就是互斥鎖定啊,還有呢?」

小博看到小君這麼滿足的表情,心裡亂羨慕的,因為他也覺得很口渴。而這就是女生們的一個「小」優點,出門時總是會帶一堆有用的與沒有用的東西;這也是男生們彼此心中的百般無奈,因為和男生約會的女生之所以會遲到許久,有一大部份的時間都是浪費在已經來不及赴約時還堅持要備足這些東西才出門的。小博決定待會經過便利商店時,進去買一瓶水來解渴。小博用舌頭恬恬嘴唇後說:「再來就是共享鎖定。」

小君是一個心思縝密的女孩,她剛剛在喝水時,已經注意到小博口渴的表情了,只是不太確定而已,現在又看到小博頻頻恬嘴唇,就可以確定他真得非常口渴,於是小君再次從背包中將水瓶子取出,面帶微笑地遞給他,叫他把剩下幾口水一次喝完吧。小博本來還不好意思接受,在小君再三強調沒關係後才很感激地接過來,打開瓶蓋,一口喝完。小君看著小博非常快樂地喝著水,也被感染了這種氣氛,害她一邊問小博時,還一臉莫名笑笑的樣子:「為甚麼鎖定了,還可以共享啊,這算哪門子鎖定啊?」

雖然尚未完全解渴,但小博對這及時來的救命水可是感恩在心頭呀!他一邊把玩著這空瓶子,一邊回答小君的問題:「這樣子的鎖定,是對於一個資源或是一筆資料被讀取或參考的時候,所設定的。也就是說當資料被讀取的時候是可以共享的,只有在資料閒置沒有被讀取、更改、或寫入的時候,才允許某一個交易過程進入寫入或更改。」

眼看小博的一雙大手就要把瓶子玩壞掉了,小君一把將瓶子從小博的手上解救過來,放回背包裡收好。邊收時邊問:「那也就是說,共享鎖定比互斥鎖定有更強的資料並行性囉。」

小博的表情有如久旱初逢甘霖一樣地喜悅,活像個小孩子似的。只見他神情愉快地對小君提出一個問題:「那當然囉,不過鎖定的機制會導致一個問題,妳知道嗎?」

小君想了一下,甩甩頭,直接了當地回應:「不知道耶,有甚麼問題嗎?」

小博的語氣就好像在頒發奧斯卡金像獎(場面比較大)一樣的誇張,又像在揭曉謎底一樣的神秘。他輕輕地說:「就是死結,當有些交易過程本身鎖定了一些資源,卻又在等待別的交易過程所鎖定的資源。這些交易處理最後彼此間形成了一個鎖定迴圈,而無法動彈,就形成了所謂的死結。」

小君很不滿意小博說得不清不楚,於是把她的疑問逐條提出:「那麼死結有辦法避免嗎?以及發生了死結要怎麼處理呢?」

小博覺得小君的問題問到了重點,這代表她已經能夠掌握到資料庫系統的基本精神了。為了報答這位救命恩人,小博決定據實以告:「當然有辦法避免與處理死結,首先當某個交易過程想對某個資料進行鎖定的時候,系統即判定這樣的鎖定是否會發生死結,不過避免的動作實在是很浪費系統資源。」

小君的反應頗快,才剛聽完小博的話,馬上進行結論:「所以說進行發生死結後的處理會比較有效率囉。」

小博繼續講解和「死結」相關的延伸主題:「沒錯,這對整個系統而言是比較有效率的作法,當系統發現了死結的產生,系統必須選擇一個犧牲者,將這個犧牲者的交易撤回原點,不過問題又來了,妳知道這樣做會有甚麼樣的問題嗎?」

小君發現小博說的話好像有一點點的問題,再仔細思考一下,察覺是出在如何選擇犧牲者這件事情上面,因此她稍微整理一下思緒後,提出她的看法與抗議:「嗯,我想想看喔,如果每次犧牲者都是同一個,那不是很不公平。」

小博像個青天大人一樣的受理小君的抗議,只不過這個審案的大人得即時給個交待,不能拖延整個案子,而且還要邊走邊說明清楚:「的確會有這樣的問題發生,因為在一個交易的系統中,優先權難免有別,所以我們可以增加犧牲者的優先權來改善這樣的狀況。」

小君聽完青天大人的判決後,很滿意地說:「所以,這麼做的話,既可以增加系統的效率,死結的處理又可以獲得解決,那麼系統就可以安心的使用鎖定的機制囉。」

天色漸漸暗了下來,街道兩旁商家的招牌一個個亮了起來,小博看了一下手錶,哇塞,才稍微講一下話,就已經六點了,怎麼歡樂的時間總是過得這麼快呀,唉,真希望時間能從此刻起能即時凍住,讓他多享受享受。念頭才起來,馬上就聽到肚子在抗議了,他當下提醒小君:「妳說的一點也沒錯,對了,妳不是要去領錢請我吃飯,課就先上到這裡啦。」

「我想我又學到豐富的一課了。可以安心的去吃飯跟瞎拼啦。」小君也聽到小博肚子發出的「咕嚕咕嚕」聲,當下覺得太對不起小博,連忙結束整個資料庫系統的交談,趕緊領錢去囉。


[ 目錄 ] / [ 本節目錄 ] [ 上一篇 ] [ 下一篇 ]


lake@mail.bamboo.hc.edu.tw