悲觀鎖和樂觀鎖面試
這個問題一直是面試中常常被問到的,可是每次被問到都懵啊,而後今天就在網上了解了一下,只是我的理解,嘿嘿!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去實現,爲什麼還要使用這兩種鎖機制呢?但願看到此微博的大森們能夠給予解答~