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