悲觀鎖和樂觀鎖

悲觀鎖和樂觀鎖面試

 

這個問題一直是面試中常常被問到的,可是每次被問到都懵啊,而後今天就在網上了解了一下,只是我的理解,嘿嘿!sql

 

首先悲觀鎖 ,顧名思義就是它是一個悲觀的鎖,每次都懼怕別人去訪問他,因此給本身加了個把鎖,多是一行或者整個表。舉個例子:數據庫

首先創建一張user表併發

開啓一個窗口,開始一個事務線程

BEGIN;rest

select * from user where name ='bb' for update(爲name=bb的記錄加修改鎖)事務

 

再開啓另外一個窗口it

 

update user set name='cc' where id =1io

 

發現sql一直在執行中,最後會抱一個錯誤,以下微博

[SQL]

update user set name='cc' where id =1

 

[Err] 1205 - Lock wait timeout exceeded; try restarting transaction

 

直到我在第一個事務中執行commit ,這個纔會修改經過

 

樂觀鎖

 

固然它是那麼的樂觀,覺得別人不會改變你的記錄,可是他會每次在你提交語句的時候檢查更新,它的策略是添加一個version版本,即爲數據增長一個版本標識,在每次作寫操做的時候version++,而後比對第一次和第二次的操做對比,若是提交的數據版本號大於數據庫表當前版本號,則予以更新,不然認爲是過時數據。

 

對於他們的不一樣使用場景我仍是有點不甚明瞭,固然他們確定都是用於併發操做。而且也可使用併發線程鎖lock去實現,爲什麼還要使用這兩種鎖機制呢?但願看到此微博的大森們能夠給予解答~

相關文章
相關標籤/搜索