悲觀鎖,正如其名,具有強烈的獨占和排他特性,它指的是對數(shù)據(jù)被外界修改持保守態(tài)度。樂觀鎖機制采取了更加寬松的加鎖機制,樂觀鎖是相對悲觀鎖而言,也是為了避免數(shù)據(jù)庫幻讀、業(yè)務處理時間過長等原因引起數(shù)據(jù)處理錯誤的一種機制。
樂觀鎖( Optimistic Locking )
樂觀鎖是相對悲觀鎖而言的,樂觀鎖假設數(shù)據(jù)一般情況下不會造成沖突,所以在數(shù)據(jù)進行提交更新的時候,才會正式對數(shù)據(jù)的沖突與否進行檢測,如果發(fā)現(xiàn)沖突了,則返回給用戶錯誤的信息,讓用戶決定如何去做。
百度百科:
樂觀鎖機制采取了更加寬松的加鎖機制。樂觀鎖是相對悲觀鎖而言,也是為了避免數(shù)據(jù)庫幻讀、業(yè)務處理時間過長等原因引起數(shù)據(jù)處理錯誤的一種機制,但樂觀鎖不會刻意使用數(shù)據(jù)庫本身的鎖機制,而是依據(jù)數(shù)據(jù)本身來保證數(shù)據(jù)的正確性。
相對于悲觀鎖,在對數(shù)據(jù)庫進行處理的時候,樂觀鎖并不會使用數(shù)據(jù)庫提供的鎖機制。一般的實現(xiàn)樂觀鎖的方式就是記錄數(shù)據(jù)版本。
樂觀并發(fā)控制相信事務之間的數(shù)據(jù)競爭(data race)的概率是比較小的,因此盡可能直接做下去,直到提交的時候才去鎖定,所以不會產生任何鎖和死鎖。
悲觀鎖(Pessimistic Lock)
當要對數(shù)據(jù)庫中的一條數(shù)據(jù)進行修改的時候,為了避免同時被其他人修改,最好的辦法就是直接對該數(shù)據(jù)進行加鎖以防止并發(fā)。這種借助數(shù)據(jù)庫鎖機制,在修改數(shù)據(jù)之前先鎖定,再修改的方式被稱之為悲觀并發(fā)控制【又名“悲觀鎖”,Pessimistic Concurrency Control,縮寫“PCC”】。
百度百科:
悲觀鎖,正如其名,具有強烈的獨占和排他特性。它指的是對數(shù)據(jù)被外界(包括本系統(tǒng)當前的其他事務,以及來自外部系統(tǒng)的事務處理)修改持保守態(tài)度。因此,在整個數(shù)據(jù)處理過程中,將數(shù)據(jù)處于鎖定狀態(tài)。悲觀鎖的實現(xiàn),往往依靠數(shù)據(jù)庫提供的鎖機制(也只有數(shù)據(jù)庫層提供的鎖機制才能真正保證數(shù)據(jù)訪問的排他性,否則,即使在本系統(tǒng)中實現(xiàn)了加鎖機制,也無法保證外部系統(tǒng)不會修改數(shù)據(jù))。
之所以叫做悲觀鎖,是因為這是一種對數(shù)據(jù)的修改抱有悲觀態(tài)度的并發(fā)控制方式。我們一般認為數(shù)據(jù)被并發(fā)修改的概率比較大,所以需要在修改之前先加鎖。
悲觀鎖主要分為共享鎖或排他鎖
-
共享鎖【Shared lock】又稱為讀鎖,簡稱S鎖。顧名思義,共享鎖就是多個事務對于同一數(shù)據(jù)可以共享一把鎖,都能訪問到數(shù)據(jù),但是只能讀不能修改。
-
排他鎖【Exclusive lock】又稱為寫鎖,簡稱X鎖。顧名思義,排他鎖就是不能與其他鎖并存,如果一個事務獲取了一個數(shù)據(jù)行的排他鎖,其他事務就不能再獲取該行的其他鎖,包括共享鎖和排他鎖,但是獲取排他鎖的事務是可以對數(shù)據(jù)行讀取和修改。
悲觀并發(fā)控制實際上是“先取鎖再訪問”的保守策略,為數(shù)據(jù)處理的安全提供了保證。
但是在效率方面,處理加鎖的機制會讓數(shù)據(jù)庫產生額外的開銷,還有增加產生死鎖的機會。另外還會降低并行性,一個事務如果鎖定了某行數(shù)據(jù),其他事務就必須等待該事務處理完才可以處理那行數(shù)據(jù)。