---
# System prepended metadata

title: 鎖跟DB 相關
tags: [觀念重點區]

---

# 鎖跟DB 相關

https://www.gushiciku.cn/pl/gKzx/zh-tw


## mvcc跟lock
![image](https://hackmd.io/_uploads/rksj0xsjR.png)

讀 不用lock
讀+判斷 需要共享lock 不讓別人改
讀+寫 一定要確保寫入的是正確的 所以要悲觀
## 鎖
https://ithelp.ithome.com.tw/articles/10320923

## 共享
![image](https://hackmd.io/_uploads/B1wXL0fva.png)


## 基本差異
Cache鎖
鎖service cache

BD不是鎖
是git 的紀錄 


DB裡面的行鎖才是鎖

## 樂觀鎖
樂觀鎖之所以叫樂觀，是因為這個模式不會對資料加鎖。而是對資料操作保持一種樂觀的心態，認為不會產生併發操作問題（即不會有其他執行緒同時對資料進行修改）

樂觀鎖查詢資料時直接進行查詢，更新時會判斷其他執行緒有沒有對資料進行修改，如果沒有則進行更新，反之則拒絕更新。



樂觀鎖最常用資料版本（Version）的記錄機制實現。即為資料增加一個版本標識，一般是通過為資料庫表增加一個數字型別的 “version” 欄位來實現。當讀取資料時，將version欄位的值一同讀出，資料每更新一次，對此version值加1。

當我們提交更新的時候，判斷資料庫表對應記錄的當前版本資訊與第一次取出來的version值進行比對，如果資料庫表當前版本號與第一次取出來的version值相等，則予以更新，否則認為是過期資料

## 悲觀鎖
悲觀鎖就比較狠了，悲觀鎖對資料做“有罪推定”。即在操作資料時，預設此操作會出現資料衝突，所以在進行每次操作時都要加鎖才能進行對相同資料的操作。

一旦加鎖，不同執行緒同時執行時，只能有一個執行緒執行，其他的執行緒在入口處等待，直到鎖被釋放。


悲觀鎖可以由資料庫語句實現，分為**共享鎖**和**排它鎖**。


## 共享鎖 (lock in share mode)
共享鎖又稱讀鎖 (read lock)，是讀取操作建立的鎖。其他使用者可以併發讀取資料，但任何事務都不能對資料進行修改（獲取資料上的排他鎖），直到已釋放所有共享鎖。如果事務對讀鎖進行修改操作，很可能會造成死鎖

## 排它鎖 (for update)
排他鎖又稱寫鎖(exclusive lock or writer lock)。若某個事務對某一行加上了排他鎖，只能這個事務對其進行讀寫，在此事務結束之前，其他事務不能對其進行加任何鎖，其他程序可以讀取，不能進行寫操作，需等待其釋放。排它鎖會阻塞所有的排它鎖和共享鎖。

## 分布式鎖
需要保证一个方法在同一时间内只能被同一个线程执行
https://zhuanlan.zhihu.com/p/42056183

###### tags: `觀念重點區`
