在事務(wù)系統(tǒng)中很重要的一個(gè)概念就是“鎖”。在事務(wù)系統(tǒng)中“事務(wù)”概念保證了數(shù)據(jù)訪問(wèn)的原子性,即單事務(wù)進(jìn)程中一組數(shù)據(jù)訪問(wèn)的一致性,而“鎖”的概念保證了數(shù)據(jù)訪問(wèn)的隔離性與排他性,即并發(fā)事務(wù)進(jìn)程之間的同步訪問(wèn)的獨(dú)立性。有一個(gè)數(shù)據(jù)分別有兩個(gè)用戶(hù)要去修改,我們需要通過(guò)一些機(jī)制來(lái)保證這些數(shù)據(jù)在某個(gè)操作過(guò)程中不會(huì)被外界修改,這樣的機(jī)制也就是所謂的,即給我們選定的目標(biāo)數(shù)據(jù)上鎖,使其無(wú)法被其他程序修改。

一般在事務(wù)系統(tǒng)中的“鎖”機(jī)制可以分為兩種不同的模式:悲觀鎖模式以及樂(lè)觀鎖模式。這兩種“鎖”模式要解決的問(wèn)題都大致一樣:多程之間的同步訪問(wèn)的獨(dú)立性問(wèn)題。只是環(huán)境上下文有所不同。當(dāng)然,這就會(huì)導(dǎo)致,解決該問(wèn)題的方案有所區(qū)別。

樂(lè)觀鎖模式:樂(lè)觀鎖模式假設(shè)環(huán)境中需要同時(shí)訪問(wèn)同一數(shù)據(jù)的并發(fā)事務(wù)較多,但訪問(wèn)數(shù)據(jù)時(shí)間較短,事務(wù)進(jìn)程可以忍受少量的數(shù)據(jù)修改失敗。由于使用了如此假設(shè),則使用的加鎖方案策略就比較寬松。一般使用于數(shù)據(jù)本身相關(guān)的版本控制機(jī)制來(lái)實(shí)現(xiàn)。
   
    比較常見(jiàn)的手法就是用數(shù)據(jù)的一部分或另外增加一部分作為修改的版本號(hào),在修改視校對(duì)版本號(hào),一旦校對(duì)正確就同時(shí)修改數(shù)據(jù)本體與版本號(hào);如果校對(duì)版本號(hào)失敗則表示數(shù)據(jù)過(guò)期,可以回滾事務(wù)。使用該方式時(shí),如果訪問(wèn)數(shù)據(jù)的事務(wù)進(jìn)程都來(lái)自同一個(gè)系統(tǒng),則完全可以達(dá)到隔離要求。然而,如果事務(wù)進(jìn)程是來(lái)自不同系統(tǒng),那么事情就比較麻煩了。因?yàn)椋瑑蓚€(gè)系統(tǒng)不是相同的“鎖”方案就會(huì)導(dǎo)致混亂的局面。這時(shí)候可能就需要嚴(yán)格一些的樂(lè)觀鎖。
   
    較之前的樂(lè)觀鎖實(shí)現(xiàn)方案,還有一種比較嚴(yán)格的樂(lè)觀鎖方案。就是在版本號(hào)上做文章,使用數(shù)據(jù)完全關(guān)聯(lián)的版本號(hào)。比如,對(duì)整個(gè)數(shù)據(jù)進(jìn)行
hash處理得出一個(gè)版本號(hào)。每當(dāng)修改數(shù)據(jù)的任何一部分時(shí)都先檢查校對(duì)版本號(hào),一旦成功就更新的數(shù)據(jù)以及整個(gè)新的數(shù)據(jù)的hash版本號(hào);如果校對(duì)版本號(hào)失敗則表示數(shù)據(jù)過(guò)期,可以回滾事務(wù)。使用該策略,可以包保證的多系統(tǒng)訪問(wèn)獨(dú)立性。然而,不論是把這個(gè)hash過(guò)程放在事務(wù)進(jìn)程所在的系統(tǒng)還是放在數(shù)據(jù)所在的系統(tǒng)均會(huì)對(duì)整個(gè)體系的性能造成影響。

悲觀鎖模式:悲觀鎖,正如其名,它指的是對(duì)數(shù)據(jù)被外界(包括本系統(tǒng)當(dāng)前的其他事務(wù),以及來(lái)自外部系統(tǒng)的事務(wù)處理)修改持保守態(tài)度。其策略也就比較嚴(yán)格,在整個(gè)數(shù)據(jù)被訪問(wèn)的期間該“鎖”都將鎖住數(shù)據(jù)禁止他人訪問(wèn)。一般使用數(shù)據(jù)所在系統(tǒng)本身的功能來(lái)實(shí)現(xiàn)悲觀鎖。

舉個(gè)具體例子:有些關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)支持select …for update功能。該功能表示,在用戶(hù)使用該查詢(xún)語(yǔ)句時(shí),系統(tǒng)將鎖住被選的數(shù)據(jù)項(xiàng)或數(shù)據(jù)表。這樣就拒絕了其他用戶(hù)訪問(wèn),直到該用戶(hù)主動(dòng)解開(kāi)鎖,或者鎖超時(shí)。

參考:"POEAA", http://blog.sohu.com/members/walker/