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