事務隔離一般經過鎖定任何對事務中資源的訪問來實現的。總的來講,有兩種方法針對事務的鎖定:樂觀鎖(Pessimistic locking)和悲觀鎖(Optimistic locking)數據庫
悲觀鎖,正如其名,它指的是對數據被外界(包括本系統當前的其餘事務,以及來自外部系統的事務處理)修改持保守態度,所以,在整個數據處理過程當中,將數據處於鎖定狀態。悲觀鎖的實現,每每依靠數據庫提供的鎖機制 (也只有數據庫層提供的鎖機制才能真正保證數據訪問的排他性,不然,即便在本系統中實現了加鎖機制,也沒法保證外部系統不會修改數據)。安全
悲觀鎖的缺點在於,資源第一次的訪問就會被事務鎖定,除非事務完成,資源始終是不可訪問的。若是大量事務都是僅僅對事務進行檢索而不是更新操做,那麼這種排它鎖會大量阻塞,引發鎖的爭用。這種狀況下,樂觀鎖會是一種更好的方案。在使用悲觀鎖的狀況下,是經過請求失敗來保證併發安全性的。以銀行系統爲例,一旦一個帳戶經過事務來訪問,那麼就會鎖定整個帳戶。其餘的事務嘗試訪問帳戶都會被延遲,阻塞,直到以前的事務結束(完成或者回滾)。悲觀鎖會一直存在,直到事務提交或者回滾。markdown
樂觀鎖( Optimistic Locking ) 相對悲觀鎖而言,樂觀鎖假設認爲數據通常狀況下不會形成衝突,因此在數據進行提交更新的時候,纔會正式對數據的衝突與否進行檢測,若是發現衝突了,則讓返回用戶錯誤的信息,讓用戶決定如何去作。那麼咱們如何實現樂觀鎖呢,通常來講有如下2種方式:併發
在使用樂觀鎖的時候,資源並不會在第一次由事務訪問的時候就鎖定,相反,資源的狀態會使用悲觀鎖的方式鎖定。當其餘事務併發的訪問資源,而且訪問資源的時候,是可能出現衝突的。當提交的時候,資源將要持久化到存儲的時候,會從新讀取資源的狀態,而後對比事務第一次訪問的時候所鎖定的狀態,若是兩個狀態不一樣,就會有衝突,從而事務會回滾。性能
一樣以銀行應用爲例,帳戶第一次由事務訪問的時候,就記錄了帳戶的餘額。當事務修改了帳戶的餘額的時候,帳戶的信息會在執行更新以前再次查詢帳戶的餘額。若是餘額在事務期間有變化,那麼事務就會失敗,若是餘額沒有變化,那麼此次修改就會被持久化到存儲中。事務
樂觀併發控制(OCC)是一種應用到事務系統中的併發控制方法,好比在關係數據庫管理系統以及軟件事務內存等。OCC的理論依據是多數事務在執行更新的時候,是不會影響到彼此的。在運行時,事務使用資源是不須要獲取資源的鎖的,可是在提交以前,每一個事務都會驗證並無其餘的事務在修改數據。若是檢查碰到了更新衝突,那麼事務的提交會回滾,而後從新執行。內存
前面提到了OCC的理論依據,因此OCC通常用於低數據衝突的環境。當爭用不多的時候,事務就可以幾乎不須要付出管理鎖的代價,也不須要等待其餘事務完成了。這樣能夠比其它併發控制帶來更高的吞吐。固然了,若是數據資源頻繁出現爭用的話,那麼事務的重啓就會嚴重的影響性能了。這個時候使用其餘併發控制可能更好。然而,基於鎖的方法(悲觀鎖)在鎖定數據的時候,會嚴重限制併發性能。資源