最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解讀mysql的for update用法

 更新時(shí)間:2023年08月29日 09:12:27   作者:韓師學(xué)子--小倪  
這篇文章主要介紹了解讀mysql的for update用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

mysql的for update用法

for update是在數(shù)據(jù)庫(kù)中上鎖用的,可以為數(shù)據(jù)庫(kù)中的行上一個(gè)排它鎖。

當(dāng)一個(gè)事務(wù)的操作未完成時(shí)候,其他事務(wù)可以讀取但是不能寫(xiě)入或更新。

for update的使用場(chǎng)景

如果遇到存在高并發(fā)并且對(duì)于數(shù)據(jù)的準(zhǔn)確性很有要求的場(chǎng)景,是需要了解和使用for update的。

比如涉及到金錢(qián)、庫(kù)存等。一般這些操作都是很長(zhǎng)一串并且是開(kāi)啟事務(wù)的。

如果庫(kù)存剛開(kāi)始讀的時(shí)候是1,而立馬另一個(gè)進(jìn)程進(jìn)行了update將庫(kù)存更新為0了,而事務(wù)還沒(méi)有結(jié)束,會(huì)將錯(cuò)的數(shù)據(jù)一直執(zhí)行下去,就會(huì)有問(wèn)題。

所以需要for upate 進(jìn)行數(shù)據(jù)加鎖防止高并發(fā)時(shí)候數(shù)據(jù)出錯(cuò)。

記住一個(gè)原則:一鎖二判三更新

for update如何使用

使用姿勢(shì):

select * from table where xxx for update

for update的鎖表

InnoDB默認(rèn)是行級(jí)別的鎖,當(dāng)有明確指定的主鍵時(shí)候,是行級(jí)鎖。否則是表級(jí)別。

例子:

假設(shè)表foods ,存在有id跟name、status三個(gè)字段,id是主鍵,status有索引。

例1: (明確指定主鍵,并且有此記錄,行級(jí)鎖)

SELECT * FROM foods WHERE id=1 FOR UPDATE;
SELECT * FROM foods WHERE id=1 and name='咖啡色的羊駝' FOR UPDATE;

例2: (明確指定主鍵/索引,若查無(wú)此記錄,無(wú)鎖)

SELECT * FROM foods WHERE id=-1 FOR UPDATE;

例3: (無(wú)主鍵/索引,表級(jí)鎖)

SELECT * FROM foods WHERE name='咖啡色的羊駝' FOR UPDATE;

例4: (主鍵/索引不明確,表級(jí)鎖)

SELECT * FROM foods WHERE id<>'3' FOR UPDATE;
SELECT * FROM foods WHERE id LIKE ‘3' FOR UPDATE;

for update的注意點(diǎn)

1.for update 僅適用于InnoDB,并且必須開(kāi)啟事務(wù),在begin與commit之間才生效。

2.要測(cè)試for update的鎖表情況,可以利用MySQL的Command Mode,開(kāi)啟二個(gè)視窗來(lái)做測(cè)試。

for update的疑問(wèn)點(diǎn)

當(dāng)開(kāi)啟一個(gè)事務(wù)進(jìn)行for update的時(shí)候,另一個(gè)事務(wù)也有for update的時(shí)候會(huì)一直等著,直到第一個(gè)事務(wù)結(jié)束嗎?

答:會(huì)的。除非第一個(gè)事務(wù)commit或者rollback或者斷開(kāi)連接,第二個(gè)事務(wù)會(huì)立馬拿到鎖進(jìn)行后面操作。

如果沒(méi)查到記錄會(huì)鎖表嗎?

答:會(huì)的。表級(jí)鎖時(shí),不管是否查詢到記錄,都會(huì)鎖定表。

for update和for update nowait區(qū)別(前者阻塞其他事務(wù),后者拒絕其他事務(wù))

for update鎖住表或者鎖住行,只允許當(dāng)前事務(wù)進(jìn)行操作(讀寫(xiě)),其他事務(wù)被阻塞,直到當(dāng)前事務(wù)提交或者回滾,被阻塞的事務(wù)自動(dòng)執(zhí)行

for update nowait 鎖住表或者鎖住行,只允許當(dāng)前事務(wù)進(jìn)行操作(讀寫(xiě)),其他事務(wù)被拒絕,事務(wù)占據(jù)的statement連接也會(huì)被斷開(kāi)

mysql排它鎖(FOR UPDATE) 場(chǎng)景

場(chǎng)景一 

當(dāng)前使用for UPDATE查詢,其他地方查詢   --   其他地方也使用for UPDATE會(huì)堵塞,其他地方未使用for UPDATE不會(huì)堵塞

1. 當(dāng)前A(不區(qū)分是否為事務(wù)里)使用for UPDATE查詢

SELECT * FROM saas_employee_label_person where id = 1 for UPDATE

1.1 其他地方B(不在上一個(gè)連接里或事務(wù)里,不區(qū)分是否為事務(wù)里)使用for UPDATE 查詢(需要獲取鎖)

SELECT * FROM saas_employee_label_person where id = 1 for UPDATE

會(huì)發(fā)生堵塞等待前一個(gè)A鎖釋放(A事務(wù)提交,或者A結(jié)束運(yùn)行(A為非事務(wù)場(chǎng)景))

1.2 其他地方C(不區(qū)分是否為事務(wù)里)不使用for UPDATE 查詢(無(wú)需獲取鎖)

SELECT * FROM saas_employee_label_person where id = 1

不會(huì)堵塞,可以查詢

場(chǎng)景二 

當(dāng)前使用for UPDATE查詢,其他地方UPDATE更新   --   會(huì)堵塞等待

2. 當(dāng)前A(不區(qū)分是否為事務(wù)里)使用for UPDATE查詢

SELECT * FROM saas_employee_label_person where id = 1 for UPDATE

2.1 其他地方B(不區(qū)分是否為事務(wù)里)使用UPDATE更新數(shù)據(jù)

UPDATE saas_employee_label_person set employee_id = 1111 where id = 1;

會(huì)發(fā)生堵塞等待前一個(gè)A鎖釋放(A事務(wù)提交,或者A結(jié)束運(yùn)行(A為非事務(wù)場(chǎng)景))

場(chǎng)景三 

當(dāng)前事務(wù)使用UPDATE更新,其他地方使用for UPDATE查詢   --   會(huì)堵塞等待

3. 當(dāng)前事務(wù)A 使用UPDATE更新

BEGIN;
UPDATE saas_employee_label_person set employee_id = 11121 where id = 1;

3.1 其他地方B(不區(qū)分是否為事務(wù)里)使用 for UPDATE查詢

SELECT * FROM saas_employee_label_person where id = 1 for UPDATE

會(huì)發(fā)生堵塞等待前一個(gè)事務(wù)A提交才可以獲得鎖

場(chǎng)景四

當(dāng)前非事務(wù)使用UPDATE更新,其他地方使用for UPDATE查詢   --   不會(huì)堵塞

4. 當(dāng)前A(非事務(wù)下) 使用UPDATE更新

UPDATE saas_employee_label_person set employee_id = 11121 where id = 1;

4.1 其他地方B(不區(qū)分是否為事務(wù)里)使用 for UPDATE查詢

SELECT * FROM saas_employee_label_person where id = 1 for UPDATE

不會(huì)堵塞,前一個(gè)update先執(zhí)行完,所以不影響,這里一定是update先執(zhí)行完在走for UPDATE查詢的場(chǎng)景,否者就是場(chǎng)景二了

場(chǎng)景五

當(dāng)前普通查詢,其他地方使用for UPDATE查詢   --   不影響,不會(huì)堵塞

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 虛擬機(jī)Centos7安裝MySQL數(shù)據(jù)庫(kù)實(shí)踐

    虛擬機(jī)Centos7安裝MySQL數(shù)據(jù)庫(kù)實(shí)踐

    用戶分享在虛擬機(jī)安裝MySQL的全過(guò)程及常見(jiàn)問(wèn)題解決方案,包括處理GPG密鑰、修改密碼策略、配置遠(yuǎn)程訪問(wèn)權(quán)限及防火墻設(shè)置,最終通過(guò)關(guān)閉防火墻和停止NetworkManager解決網(wǎng)絡(luò)連接異常問(wèn)題
    2025-07-07
  • 關(guān)于mysql主備切換canal出現(xiàn)的問(wèn)題解決

    關(guān)于mysql主備切換canal出現(xiàn)的問(wèn)題解決

    這篇文章主要給大家介紹了關(guān)于mysql主備切換canal出現(xiàn)的一些問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • MySQL是如何處理排序的(最新推薦)

    MySQL是如何處理排序的(最新推薦)

    在MySQL的查詢中常常會(huì)用到order by和group by這兩個(gè)關(guān)鍵字,它們的相同點(diǎn)是都會(huì)對(duì)字段進(jìn)行排序,那查詢語(yǔ)句中的排序是如何實(shí)現(xiàn)的呢,下面跟隨小編一起看看吧
    2024-05-05
  • MySQL定時(shí)全庫(kù)備份數(shù)據(jù)庫(kù)

    MySQL定時(shí)全庫(kù)備份數(shù)據(jù)庫(kù)

    數(shù)據(jù)備份真的很重要, 因?yàn)榭赡苡幸惶鞌?shù)據(jù)會(huì)被莫名其妙的刪掉了,本文主要介紹了MySQL定時(shí)備份數(shù)據(jù)庫(kù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • MySql索引詳細(xì)介紹及正確使用方法

    MySql索引詳細(xì)介紹及正確使用方法

    這篇文章主要介紹了MySql索引詳細(xì)介紹及正確使用方法的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • MySQL的視圖和索引用法與區(qū)別詳解

    MySQL的視圖和索引用法與區(qū)別詳解

    這篇文章主要介紹了MySQL的視圖和索引用法與區(qū)別詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Mysql?exists用法小結(jié)

    Mysql?exists用法小結(jié)

    這篇文章主要介紹了Mysql?exists用法的的相關(guān)資料,幫助大家更好的理解和使用MySQL,感興趣的朋友可以了解下
    2020-12-12
  • 詳解MySQL事務(wù)日志redo log

    詳解MySQL事務(wù)日志redo log

    你知道MySQL 中是如何保證數(shù)據(jù)不丟失的嗎,即便是MySQL發(fā)生異常重啟了,數(shù)據(jù)也可以恢復(fù),你了解MySQL產(chǎn)生的事務(wù)日志redo log是干嘛的嗎,明白它的工作機(jī)制嗎,本文就給大家詳細(xì)講解MySQL事務(wù)日志redo log
    2023-07-07
  • MySQL?中的服務(wù)器配置和狀態(tài)詳解(MySQL?Server?Configuration?and?Status)

    MySQL?中的服務(wù)器配置和狀態(tài)詳解(MySQL?Server?Configuration?and?Statu

    MySQL服務(wù)器配置和狀態(tài)設(shè)置包括服務(wù)器選項(xiàng)、系統(tǒng)變量和狀態(tài)變量三個(gè)方面,可以通過(guò)命令行、配置文件或SQL語(yǔ)句進(jìn)行設(shè)置和查看,服務(wù)器選項(xiàng)和系統(tǒng)變量可以是全局或會(huì)話級(jí)別的,狀態(tài)變量只讀且不可修改,sql_mode是一個(gè)特殊的變量,影響SQL語(yǔ)句的執(zhí)行模式,感興趣的朋友一起看看吧
    2025-02-02
  • MySQL中CREATE DATABASE語(yǔ)句創(chuàng)建數(shù)據(jù)庫(kù)的示例

    MySQL中CREATE DATABASE語(yǔ)句創(chuàng)建數(shù)據(jù)庫(kù)的示例

    在MySQL中,可以使用CREATE DATABASE語(yǔ)句創(chuàng)建數(shù)據(jù)庫(kù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-09-09

最新評(píng)論

平原县| 灯塔市| 西昌市| 都兰县| 临颍县| 治县。| 许昌市| 朔州市| 保德县| 收藏| 射洪县| 佛冈县| 象山县| 郑州市| 德格县| 田林县| 剑川县| 泗水县| 曲阜市| 鄂伦春自治旗| 教育| 博湖县| 长白| 沙雅县| 独山县| 望城县| 吉隆县| 河西区| 油尖旺区| 萨嘎县| 陈巴尔虎旗| 大城县| 芷江| 河曲县| 安宁市| 斗六市| 蒙阴县| 石景山区| 徐州市| 宿迁市| 永年县|