1. 程式人生 > >MySQL數據庫同步之悲觀鎖和樂觀鎖

MySQL數據庫同步之悲觀鎖和樂觀鎖

我們 測試 http 鎖定 以及 再次 否則 即使 name

測試需要:本地開兩個測試窗口

悲觀鎖

悲觀鎖它指的是對數據被外界(包括本系統當前的其他事務,以及來自外部系統的事務處理)修改持保守態度,在整個數據處理過程中,將數據處於鎖定狀態。悲觀鎖的實現,往往依靠數據庫提供的鎖機制(也只有數據庫層提供的鎖機制才能真正保證數據訪問的排他性,否則即使在本系統中實現了加鎖機制,也無法保證外部系統不會修改數據)。
一個典型的倚賴數據庫的悲觀鎖調用:
select * from table where name=‘who am i‘ for update;
這條 sql 語句鎖定了table表中所有符合檢索條件( name=‘who am i‘ )的記錄。本次事務提交之前(事務提交時會釋放事務過程中的鎖),外界無法修改這些記錄。 Hibernate 的悲觀鎖,也是基於數據庫的鎖機制實現。

一個窗口開啟一個事務但是不提交事務,執行select語句其中包含for update子語句

技術分享

另一窗口嘗試更新表

技術分享

我們可以看到報錯了內容是:鎖等待超時超過;試著重新啟動事務

這個時候我們提交事務

技術分享

再次嘗試更新時更新成功了

技術分享

MySQL數據庫同步之悲觀鎖和樂觀鎖