理解 悲觀鎖就是什麼事情都是需要小心翼翼,生怕弄錯了出大問題,
一般情況下 "增刪改" 都是有事務在進行操作的,但是 "查" 是不需要事務操作的,
但是凡事沒有例外,比如雙十一購物,很多人搶購乙個物品,但是商品總數(假設5個)
同一時間進行操作,每個人都能看到物品多少個,都早同一時間下單,但是只有5個商品,只有5個使用者能過購買到(每人乙個購買),其他人也會顯示出訂單的操作,但是庫存已經是為0無法購買的行為(顯示還是5ge庫存),會給使用者造成不好體驗
既讓如此 為什麼不讓乙個事務鎖定物品的個數修改,而其他使用者只能檢視,並不能下單,當使用者進行updata操作之後釋放鎖,其他使用者才能根據情況下單,再次把物品行鎖住(不會出現訂單表交錢了還提示沒庫存)
可能我說的不是很準確,但是悲觀鎖就是一步一步走,如果輪到它則執行則鎖行操作,避免一些問題,一般用在金錢查詢,庫存查詢等...
執行sql語句格式
selectmoney
from usercred where id=
1for
update;
統一格式在select查詢條件之後增加 for updata (記住查詢條件是索引列才是鎖行不讓則是鎖表) 查詢操作中除了敏感資料查詢,其他不需要使用鎖行操作
總體理解就是 悲觀鎖是乙個在有需要求的情況下查詢語句事務中隔離性最高的ser... 序列,當悲觀鎖鎖住行時,其他事務只能等待,並且不能讀取該行悲觀資料
並且悲觀鎖只能在begin和commit之間執行
樂觀鎖 查詢出需要修改的資料,但是增加乙個字段作為乙個版本控制(像git一樣),如果進行修改一起將版本控制的字段一起where作為條件,如果符合則修改,不符合也沒事,因為資料庫中的資料給其他事務修改之後,where查詢的條件不符合,所以不會對持久化的資料造成影響
例子如下
createtable
card(
id int;
money
float
; version
int; //
樂觀鎖控制,欄位名無所謂
primary
key(id); //
主鍵 auto increment(id);
//自增長
index(money,version); //
索引);
建立上面乙個表,我使用go的gorm來表達一下操作
type card structfunc 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.悲觀鎖,正如其名,它指的是對資料被外界 包括本系統當前的其他事務,以及來自外部系統的事務處理 修改持保守態度,因此,在整個資料處理過程中,將資料處於鎖定狀態。悲觀鎖的實現,往往依靠資料庫提供的鎖機制 也只有資料庫層提供的鎖機制才能真正保證資料訪問的排他性,否則,即使在本系統中實現了加鎖機制,也無...