前幾天有人問了我乙個問題,說如果資料庫某些操作不用事務,那麼又需要保持資料的一致性,那麼該用什麼方法替代事務。我就想到了悲觀鎖和樂觀鎖的思想,下面我解釋一下在資料庫中的悲觀鎖和樂觀鎖
1.悲觀鎖就是把資料庫的一些操作,放在事務當中,依賴資料庫的隔離級別,實現對資料修改的封鎖,這樣做資料一致性可以保持的很好,但是效率比較低下,悲觀鎖從程式的角度上將,就是不在應用程式中做任何保證資料一致性操作,而是把操作放在事務中,把保證資料一致性的任務,交給資料庫去做,也就是依賴資料庫的鎖機制。
2.樂觀鎖其實從真正意義上並不是鎖,是一種代替事務的操作,在應用程式中,如果乙個事務不是太複雜,又能容忍資料的更新失敗,並且可以嘗試重複更新,那麼可以考慮用樂觀鎖來替代事務,即不通過事務來保證資料的一致性,而是通過在程式中的一些操作來保證資料的一致性,防止丟失更新,我們解決的方法就是在資料表中增加乙個版本號的字段,版本號可以用整數來做,如果實時性要求不高的話,還可以用時間戳做為版本號,就是每份資料都會維護自己的乙個資料版本號,如果更新資料的時候發現資料庫中的版本小於我們自己資料的版本,那麼就證明資料庫中的資料沒有我們自己的資料新,那麼更新資料庫中的版本號為最新的版本號;如果更新資料的時候發現資料庫中的版本大於等於我們自己資料的版本就證明,我們自己的資料已經過時,所以返回給程式更新失敗的資訊,那麼我們可以增加版本號的值,如使用時間戳,再一次去嘗試更新資料。
悲觀鎖與樂觀鎖的區別:
悲觀鎖是一種排他鎖,效率低下,但是資料安全,一般實現在資料庫中,不是實現在應用程式中,樂觀鎖準備說不是一種鎖機制,它是應用程式自己加的一種保證資料一致性的機制,所以一般實現在應用程式中,而不是實現在資料庫中,並且在hibernate中我們可以顯示配置悲觀鎖樂觀鎖,當然樂觀鎖需要在配置檔案中配置version屬性(用來充當版本號)。
悲觀鎖和樂觀鎖
1.悲觀鎖,正如其名,它指的是對資料被外界 包括本系統當前的其他事務,以及來自外部系統的事務處理 修改持保守態度,因此,在整個資料處理過程中,將資料處於鎖定狀態。悲觀鎖的實現,往往依靠資料庫提供的鎖機制 也只有資料庫層提供的鎖機制才能真正保證資料訪問的排他性,否則,即使在本系統中實現了加鎖機制,也無...
悲觀鎖和樂觀鎖
悲觀鎖 pessimistic lock 顧名思義,就是很悲觀,每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖,這樣別人想拿這個資料就會block直到它拿到鎖。傳統的關係型資料庫裡邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。樂觀鎖 optim...
悲觀鎖和樂觀鎖
悲觀鎖 pessimistic lock 顧名思義,就是很悲觀,每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖,這樣別人想拿這個資料就會block直到它拿到鎖。傳統的關係型資料庫裡邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。樂觀鎖 optim...