在事務系統中很重要的一個概念就是“鎖”。在事務系統中“事務”概念保證了數據訪問的原子性,即單事務進程中一組數據訪問的一致性,而“鎖”的概念保證了數據訪問的隔離性與排他性,即并發事務進程之間的同步訪問的獨立性。有一個數據分別有兩個用戶要去修改,我們需要通過一些機制來保證這些數據在某個操作過程中不會被外界修改,這樣的機制也就是所謂的,即給我們選定的目標數據上鎖,使其無法被其他程序修改。

一般在事務系統中的“鎖”機制可以分為兩種不同的模式:悲觀鎖模式以及樂觀鎖模式。這兩種“鎖”模式要解決的問題都大致一樣:多程之間的同步訪問的獨立性問題。只是環境上下文有所不同。當然,這就會導致,解決該問題的方案有所區別。

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

悲觀鎖模式:悲觀鎖,正如其名,它指的是對數據被外界(包括本系統當前的其他事務,以及來自外部系統的事務處理)修改持保守態度。其策略也就比較嚴格,在整個數據被訪問的期間該“鎖”都將鎖住數據禁止他人訪問。一般使用數據所在系統本身的功能來實現悲觀鎖。

舉個具體例子:有些關系數據庫管理系統支持select …for update功能。該功能表示,在用戶使用該查詢語句時,系統將鎖住被選的數據項或數據表。這樣就拒絕了其他用戶訪問,直到該用戶主動解開鎖,或者鎖超時。

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