樂觀鎖和悲觀鎖

2021-08-05 18:54:59 字數 1321 閱讀 8040

突然想起來的是很早一次面試的時候,面試官問我,你知不知道樂觀鎖和悲觀鎖的含義,當時沒有複習到那裡,只是依稀記得悲觀鎖是for update,這個給躺了,在這裡記錄一下。

悲觀鎖,正如其名,具有強烈的獨佔和排他特性。它指的是對資料被外界(包括本系統當前的其他事務,以及來自外部系統的事務處理)修改持保守態度,因此,在整個資料處理過程中,將資料處於鎖定狀態。悲觀鎖的實現,往往依靠資料庫提供的鎖機制(也只有資料庫層提供的鎖機制才能真正保證資料訪問的排他性,否則,即使在本系統中實現了加鎖機制,也無法保證外部系統不會修改資料)。

樂觀鎖機制採取了更加寬鬆的加鎖機制。悲觀鎖大多數情況下依靠資料庫的鎖機制實現,以保證操作最大程度的獨占性。但隨之而來的就是資料庫 效能的大量開銷,特別是對長事務而言,這樣的開銷往往無法承受。相對悲觀鎖而言,樂觀鎖更傾向於開發運用。

上面的解釋是度娘專供,其實總結一下就是:悲觀嘛,在自己運算元據庫的時候,總是認為有人會和他一起進行運算元據庫,所以只要我運算元據庫,我就把資料庫進行上鎖,等我操作完釋放鎖之後,其他的關於這個記錄操作才能進行操作;樂觀嘛,就是認為自己操作的時候不會有其他人的操作,但是每次更新操作的時候,都會對應一下是不是自己的版本即version;

悲觀鎖以mysql為例子,mysql 是自動進行提交事務的所以在測試之前要設定一下,set autocomment = 1;

話不多說上圖:

這個是開啟事務,然後使用for update 將這條記錄進行加鎖,如果這個是有索引的就是鎖這條記錄,如果沒有索引則是鎖整個表。

然後我們開啟另外乙個使用者進行模擬處理事務,但是不能處理,而是在鎖的外面進行等待,但不是長時間的等待,超過時間就會報出異常。

這個就是報出lock wait timeout exceeded;try restarting transaction 的異常,這只是對更新操作而言,對於查詢而言是沒有問題的。當我把第乙個埠的事務給commit掉的時候,這個便可以執行了。

這個簡單說一下,就是根據版本號,進行更新的,列如update user set email = ***[email protected] where version = ${version}的時候, 這個版本的樣子。不能修改則進行回滾,重新開始。

這之前說的實現都是資料庫的實現,悲觀鎖和樂觀鎖是一種思想在不同的資料庫有不同的處理方式,我是以mysql 為基準的。 這個裡面 樂觀鎖 適合在併發的不太高的要求下可以進行,而悲觀鎖的鎖住記錄,有較高的保證率,取捨還是要看實際開發啦。

樂觀鎖和悲觀鎖

1 悲觀鎖,正如其名,它指的是對資料被外界 包括本系統當前的其他事務,以及來自外部系統的事務處理 修改持保守態度,因此,在整個資料處理過程中,將資料處於鎖定狀態。悲觀鎖的實現,往往依靠資料庫提供的鎖機制 也只有資料庫層提供的鎖機制才能真正保證資料訪問的排他性,否則,即使在本系統中實現了加鎖機制,也無...

樂觀鎖和悲觀鎖

併發衝突 在多使用者的環境下,如果使用者同時修改同乙個文件,就會造成衝突。典型的衝突有兩種 1 丟失更新 乙個使用者的更新記錄覆蓋了另乙個人的更新。如 使用者一 讀 寫 使用者二 讀 寫 那麼使用者一就把使用者二的更新覆蓋了。2 髒讀 乙個使用者更新資料未完成時,另乙個使用者就讀取資訊。使用者一 讀...

樂觀鎖和悲觀鎖

為什麼需要鎖 併發控制 在多使用者環境中,在同一時間可能會有多個使用者更新相同的記錄,這會產生衝突。這就是著名的併發性問題。典型的衝突有 l 丟失更新 乙個事務的更新覆蓋了其它事務的更新結果,就是所謂的更新丟失。例如 使用者a把值從6改為2,使用者b把值從2改為6,則使用者a丟失了他的更新。l 髒讀...