亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

解讀mysql的for update用法

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

mysql的for update用法

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

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

for update的使用場景

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

比如涉及到金錢、庫存等。一般這些操作都是很長一串并且是開啟事務(wù)的。

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

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

記住一個原則:一鎖二判三更新

for update如何使用

使用姿勢:

select * from table where xxx for update

for update的鎖表

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

例子:

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

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

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

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

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

例3: (無主鍵/索引,表級鎖)

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

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

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

for update的注意點

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

2.要測試for update的鎖表情況,可以利用MySQL的Command Mode,開啟二個視窗來做測試。

for update的疑問點

當(dāng)開啟一個事務(wù)進行for update的時候,另一個事務(wù)也有for update的時候會一直等著,直到第一個事務(wù)結(jié)束嗎?

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

如果沒查到記錄會鎖表嗎?

答:會的。表級鎖時,不管是否查詢到記錄,都會鎖定表。

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

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

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

mysql排它鎖(FOR UPDATE) 場景

場景一 

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

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

SELECT * FROM saas_employee_label_person where id = 1 for UPDATE

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

SELECT * FROM saas_employee_label_person where id = 1 for UPDATE

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

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

SELECT * FROM saas_employee_label_person where id = 1

不會堵塞,可以查詢

場景二 

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

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;

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

場景三 

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

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

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

場景四

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

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

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

場景五

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

總結(jié)

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

相關(guān)文章

  • Mysql優(yōu)化調(diào)優(yōu)中兩個重要參數(shù)table_cache和key_buffer

    Mysql優(yōu)化調(diào)優(yōu)中兩個重要參數(shù)table_cache和key_buffer

    這篇文章主要介紹了Mysql優(yōu)化調(diào)優(yōu)中兩個重要參數(shù)table_cache和key_buffer,需要的朋友可以參考下
    2014-12-12
  • MongoDB日期查詢操作圖文詳解

    MongoDB日期查詢操作圖文詳解

    MongoDB中按日期查詢是一種常見的查詢操作,而按日期查詢也是開發(fā)人員在MongoDB工作中最常遇到的查詢?nèi)蝿?wù)之一,這篇文章主要給大家介紹了關(guān)于MongoDB日期查詢操作的相關(guān)資料,需要的朋友可以參考下
    2024-02-02
  • pymysql操作mysql數(shù)據(jù)庫的方法

    pymysql操作mysql數(shù)據(jù)庫的方法

    這篇文章主要介紹了pymysql簡單操作mysql數(shù)據(jù)庫的方法,主要講的是一些基礎(chǔ)的pymysql操作mysql數(shù)據(jù)庫的方法,結(jié)合實例代碼給大家講解的非常詳細(xì),需要的朋友可以參考下
    2023-04-04
  • phplib中的一些基本語法和函數(shù)

    phplib中的一些基本語法和函數(shù)

    phplib中常用的方法有set_file,set_block,set_var,parse,ppasre,p,get等。
    2010-04-04
  • sql語句示例之case?when作為where條件

    sql語句示例之case?when作為where條件

    這篇文章主要給大家介紹了關(guān)于sql語句示例之case?when作為where條件的相關(guān)資料,在SQL語句中CASE WHEN子句是根據(jù)條件表達式的結(jié)果來執(zhí)行不同的邏輯操作,它使用在WHERE子句中,以根據(jù)特定的條件在查詢結(jié)果中過濾數(shù)據(jù),需要的朋友可以參考下
    2023-08-08
  • Mysql數(shù)據(jù)庫的一些命令

    Mysql數(shù)據(jù)庫的一些命令

    如果你習(xí)慣用 windows 的數(shù)據(jù)庫,也就是在 圖形界面上操作數(shù)據(jù)庫的話,那么當(dāng)你在命令上 操作 mysql 將會感到陌生,其實只要你掌握了一些基本命令,還有經(jīng)常使用,熟練起來了, 將會相當(dāng)方便,而且很快速
    2013-11-11
  • MySQL索引失效的幾種情況圖文詳解

    MySQL索引失效的幾種情況圖文詳解

    索引并不是時時都會生效的,在一起情況下將導(dǎo)致索引失效,這篇文章主要給大家介紹了關(guān)于MySQL索引失效的幾種情況,文章通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • mysql enum字段類型的謹(jǐn)慎使用

    mysql enum字段類型的謹(jǐn)慎使用

    本文主要介紹了mysql enum字段類型使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • 詳解MySQL主從復(fù)制實戰(zhàn) - 基于日志點的復(fù)制

    詳解MySQL主從復(fù)制實戰(zhàn) - 基于日志點的復(fù)制

    這篇文章主要介紹了詳解MySQL主從復(fù)制實戰(zhàn) - 基于日志點的復(fù)制,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-03-03
  • mysql橫向轉(zhuǎn)縱向、縱向轉(zhuǎn)橫向排列的方法

    mysql橫向轉(zhuǎn)縱向、縱向轉(zhuǎn)橫向排列的方法

    這篇文章主要介紹了mysql橫向轉(zhuǎn)縱向、縱向轉(zhuǎn)橫向排列的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10

最新評論