你有沒有聽過這樣一句話:悲觀者正確,樂觀者成功?。那么今天我來分享下什么是樂觀鎖?和悲觀鎖。
樂觀鎖和悲觀鎖有什么區別,它們什么場景會用
樂觀鎖
樂觀鎖基于這樣的假設:多個事務在同一時間對同一數據對象進行操作的可能性很小,因此它允許多個事務同時進行,僅在事務提交時檢查是否有其他事務對數據進行了修改。
特點:
- 無鎖:樂觀鎖通常不使用數據庫的鎖定機制,而是通過其他方式(如時間戳、版本號)來確保數據一致性。
- 性能:在沖突較少的情況下,樂觀鎖可以提供更好的性能,因為它允許高并發。
- 沖突檢測:在事務提交時檢測沖突,如果檢測到沖突,事務將被回滾。
實現方式:
- 版本號:在數據表中添加一個版本號字段或時間戳字段。事務開始時記錄版本號,提交時檢查版本號是否發生變化,如果變化了,則表示有沖突。
- 時間戳:使用時間戳來控制事務的順序,如果檢測到時間戳沖突,則回滾事務。
適用場景:
- 寫沖突較少:適用于寫操作不頻繁或者寫沖突可能性較低的場景。
- 讀多寫少:適用于讀操作遠多于寫操作的環境。
- 高并發:需要支持高并發訪問的系統。
悲觀鎖
悲觀鎖基于這樣的假設:多個事務對同一數據對象的并發操作會產生沖突,因此它在事務開始時就對數據對象加鎖,直到事務結束才釋放鎖。
特點:
- 鎖定:悲觀鎖通過數據庫的鎖定機制來確保數據一致性,如行鎖或表鎖。
- 性能:在高沖突環境下,悲觀鎖可能導致更多的等待和鎖競爭,從而影響性能。
- 預防沖突:通過鎖定機制預防沖突,而不是檢測沖突。
實現方式:
- 顯式鎖定:使用數據庫的鎖定命令(如
SELECT ... FOR UPDATE
)來顯式地鎖定需要的資源。 - 隱式鎖定:通過數據庫事務的隔離級別隱式地實現鎖定。
適用場景:
- 寫沖突較多:適用于寫操作頻繁或者寫沖突可能性較高的場景。
- 寫多讀少:適用于寫操作多于讀操作的環境。
- 數據一致性要求高:需要嚴格保證數據一致性的場合。