欧美一区二区三区,国内熟女精品熟女A片视频小说,日本av网,小鲜肉男男GAY做受XXX网站

Java如何實(shí)現(xiàn)對Mysql數(shù)據(jù)庫的行鎖

江奕云2年前34瀏覽0評論
Java如何實(shí)現(xiàn)對Mysql數(shù)據(jù)庫的行鎖?

在講鎖之前,首先講講兩個(gè)概念吧 ,嘿嘿 行鎖和MySQL 事務(wù)屬性

行鎖

mysql實(shí)現(xiàn)行級鎖的兩大前提就是,innodb引擎并且開啟事務(wù)。由于MySQL/InnoDB的加鎖分析,一般日常中使用方式為: select .... from table where ..... for update 語句并且在 Repeatable Read 事務(wù)隔離級別下。

行鎖的劣勢:開銷大;加鎖慢;會出現(xiàn)死鎖

行鎖的優(yōu)勢:鎖的粒度小,發(fā)生鎖沖突的概率低;處理并發(fā)的能力強(qiáng)

加鎖的方式:自動加鎖。對于UPDATE、DELETE和INSERT語句,InnoDB會自動給涉及數(shù)據(jù)集加排他鎖;對于普通SELECT語句,InnoDB不會加任何鎖;當(dāng)然我們也可以顯示的加鎖:

共享鎖:select * from table where “條件” + lock in share more

排他鎖:select * from table where ”條件“ + for update

MySQL 事務(wù)屬性

事務(wù)是由一組SQL語句組成的邏輯處理單元,事務(wù)具有ACID屬性。

原子性(Atomicity):事務(wù)是一個(gè)原子操作單元。在當(dāng)時(shí)原子是不可分割的最小元素,其對數(shù)據(jù)的修改,要么全部成功,要么全部都不成功。一致性(Consistent):事務(wù)開始到結(jié)束的時(shí)間段內(nèi),數(shù)據(jù)都必須保持一致狀態(tài)。隔離性(Isolation):數(shù)據(jù)庫系統(tǒng)提供一定的隔離機(jī)制,保證事務(wù)在不受外部并發(fā)操作影響的”獨(dú)立”環(huán)境執(zhí)行。持久性(Durable):事務(wù)完成后,它對于數(shù)據(jù)的修改是永久性的,即使出現(xiàn)系統(tǒng)故障也能夠保持。舉例說明

innodb引擎中行級鎖分為以下三種鎖

1.Record Lock

單個(gè)行記錄上的鎖

2.Gap Lock

間隙鎖,鎖定一個(gè)范圍,不包括記錄本身

3.Next-Key Lock

鎖定一個(gè)范圍和記錄本身

話不多說直接代碼開干

代碼:select * from table where order_no= '20200521xxx' for update;

order_no是主鍵的時(shí)候,可以確定唯一一條數(shù)據(jù), 所以在此加上Record Lock(即為單個(gè)記錄上鎖)

order_no是普通索引的時(shí)候,innodb層面 會根據(jù)條件鎖定一個(gè)范圍,在查詢的時(shí)候聚簇索引上加Record Lock(即為單個(gè)記錄上鎖)

order_no不是索引的時(shí)候,本條sql會進(jìn)行全表掃描,會在所有的聚簇索引上加鎖,相當(dāng)于全表鎖,這個(gè)是在mysql innodb引擎層面決定。

還有一種情況,假如后面跟多個(gè)情況

代碼:select * from table where order_no= '20200521' and code='xxx' for update;

經(jīng)過上面分析

order_no主鍵,code不是索引,查詢都只有一條數(shù)據(jù),加Record Lock

order_no 普通索引,code不是索引 ,會先掃描order_no= '20200521',范圍下加鎖

結(jié)論:我們的for update 并不時(shí)都鎖一條記錄,也并不是只有一個(gè)鎖,但是也包含我們常用的手段了,在項(xiàng)目中可以實(shí)踐用用哦

好了,如果對您有幫助,記得關(guān)注收藏轉(zhuǎn)發(fā)哦,我會一直在這里等候與您交流