mysql 學習日記 悲觀和樂觀鎖

2022-06-02 05:12:08 字數 2136 閱讀 4127

理解  悲觀鎖就是什麼事情都是需要小心翼翼,生怕弄錯了出大問題,

一般情況下 "增刪改" 都是有事務在進行操作的,但是 "查" 是不需要事務操作的,

但是凡事沒有例外,比如雙十一購物,很多人搶購乙個物品,但是商品總數(假設5個)

同一時間進行操作,每個人都能看到物品多少個,都早同一時間下單,但是只有5個商品,只有5個使用者能過購買到(每人乙個購買),其他人也會顯示出訂單的操作,但是庫存已經是為0無法購買的行為(顯示還是5ge庫存),會給使用者造成不好體驗

既讓如此 為什麼不讓乙個事務鎖定物品的個數修改,而其他使用者只能檢視,並不能下單,當使用者進行updata操作之後釋放鎖,其他使用者才能根據情況下單,再次把物品行鎖住(不會出現訂單表交錢了還提示沒庫存)

可能我說的不是很準確,但是悲觀鎖就是一步一步走,如果輪到它則執行則鎖行操作,避免一些問題,一般用在金錢查詢,庫存查詢等... 

執行sql語句格式

select

money

from usercred where id=

1for

update;

統一格式在select查詢條件之後增加 for updata (記住查詢條件是索引列才是鎖行不讓則是鎖表)            查詢操作中除了敏感資料查詢,其他不需要使用鎖行操作

總體理解就是 悲觀鎖是乙個在有需要求的情況下查詢語句事務中隔離性最高的ser...  序列,當悲觀鎖鎖住行時,其他事務只能等待,並且不能讀取該行悲觀資料

並且悲觀鎖只能在begin和commit之間執行

樂觀鎖 查詢出需要修改的資料,但是增加乙個字段作為乙個版本控制(像git一樣),如果進行修改一起將版本控制的字段一起where作為條件,如果符合則修改,不符合也沒事,因為資料庫中的資料給其他事務修改之後,where查詢的條件不符合,所以不會對持久化的資料造成影響

例子如下

create

table

card(

id int;

money

float

; version

int; //

樂觀鎖控制,欄位名無所謂

primary

key(id); //

主鍵 auto increment(id);

//自增長

index(money,version); //

索引);

建立上面乙個表,我使用go的gorm來表達一下操作

type card struct

func main()

err = db.model(&c).where("id = ? and varsion = ?",c.id,c.version).updata(c.money + 200 ,c.version+1).error()

if err !=nil

fmt.println("success")

}

樂觀鎖就不是乙個事務的操作,是手動建立的一種邏輯來保證資料一致性

根據多個條件來進行控制資料是否和查詢時一致保持安全

比方  a 操作查詢得到乙個資料,其中返回的資料集中含有 money(100)和乙個varsion(1),,你對這個資料進行修改,其中money+100,varsion+1 ,但是在你修改還沒有提交時,其他b,c,d..的連線也同時和你一樣的操作,並且比你提交commit的速度快,當你使用updata修改語句去根據先前查詢得到結果尋找資料時,對比version和money,但是已經有其他提交比你快提交了,找不到a查詢過的資料行(此時時b連線提交的資料是money = 300,version=2),所以不會提交,丟棄操作,

樂觀使用乙個額外字段保證資料和查詢出時的資料一致才會更新(更新查詢時查詢的條件要有唯一屬性,不讓更新查詢時出現多個操作不可逆)

悲觀鎖更加適合轉賬交易業務,樂觀鎖傾向並不是對資料要求絕對安全的環境,但是絕對不適用於轉賬交易等敏感地位

悲觀鎖和事務區別在於

悲觀鎖會將查詢時就將行鎖住,其他連線操作不能查詢更不能修改,但是也是事務的一種

事務  一般用於增刪改而不用於查的事務管理(雖然也可以管理查的事務,但是和悲觀鎖一樣差不多,除非時特別需求,不然不會要求對查的操作加鎖)

mysql悲觀鎖和樂觀鎖

mysql鎖機制分為表級鎖和行級鎖,本文就和大家分享一下我對mysql中行級鎖中的共享鎖與排他鎖進行分享交流。共享鎖又稱為讀鎖,簡稱s鎖,顧名思義,共享鎖就是多個事務對於同一資料可以共享一把鎖,都能訪問到資料,但是只能讀不能修改。排他鎖又稱為寫鎖,簡稱x鎖,顧名思義,排他鎖就是不能與其他所並存,如乙...

MySQL悲觀鎖和樂觀鎖

引言 之所以叫做悲觀鎖,是因為這是一種對資料的修改抱有悲觀態度的併發控制方式。我們一般認為資料被併發修改的概率比較大,所以需要在修改之前先加鎖。例子 0.開始事務 begin 1.查詢出商品庫存資訊 select quantity from items where id 1 for update 2...

悲觀鎖和樂觀鎖

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