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

MySQL并發(fā)更新數(shù)據(jù)時的處理方法

 更新時間:2019年05月22日 16:09:39   作者:Caizhenhao  
在后端開發(fā)中我們不可避免的會遇見MySQL數(shù)據(jù)并發(fā)更新的情況,作為一名后端研發(fā),如何解決這類問題也是必須要知道的,同時這也是面試中經(jīng)??疾斓闹R點。

UPDATE是否會加鎖?

SQL語句為如下時,是否會加鎖?

UPDATE table1 SET num = num + 1 WHERE id=1;

答案是不會

實際上MySQL是支持給數(shù)據(jù)行加鎖(InnoDB)的,并且在UPDATE/DELETE等操作時確實會自動加上排它鎖。只是并非只要有UPDATE關(guān)鍵字就會全程加鎖,針對上面的MySQL語句而言,其實并不只是一條UPDATE語句,而應(yīng)該類似于兩條SQL語句(偽代碼):

a = SELECT * FROM table1 WHERE id=1;
UPDATE table1 SET num = a.num + 1 WHERE id=1;

其中執(zhí)行SELECT語句時沒有加鎖,只有在執(zhí)行UPDATE時才進行加鎖的。所以才會出現(xiàn)并發(fā)操作時的更新數(shù)據(jù)不一致。原因找到了,解決問題就不遠了。而針對這類問題,解決的方法可以有2種:

  • 通過事務(wù)顯式的對SELECT進行加鎖
  • 使用樂觀鎖機制

SELECT顯式

加鎖對SELECT進行加鎖的方式有兩種,如下:

SELECT ... LOCK IN SHARE MODE  #共享鎖,其它事務(wù)可讀,不可更新
SELECT ... FOR UPDATE    #排它鎖,其它事務(wù)不可讀寫

如果你不使用這2種語句,默認情況下SELECT語句是不會加鎖的。并且對于上面提到的場景,必須使用排它鎖。另外,上面的2種語句只有在事務(wù)之中才能生效,否則不會生效。在MySQL命令行使用事務(wù)的方式如下:

SET AUTOCOMMIT=0; 
BEGIN WORK; 
 a = SELECT num FROM table1 WHERE id=2 FOR UPDATE; 
 UPDATE table1 SET num = a.num + 1 WHERE id=2; 
COMMIT WORK;

這樣只要以后更新數(shù)據(jù)時,都使用這樣事務(wù)來進行操作;那么在并發(fā)的情況下,后執(zhí)行的事務(wù)就會被堵塞,直到當(dāng)前事務(wù)執(zhí)行完成。(通過鎖把并發(fā)改成了順序執(zhí)行)

使用樂觀鎖

樂觀鎖是鎖實現(xiàn)的一種機制,它總是會天真的認為所有需要修改的數(shù)據(jù)都不會沖突。所以在更新之前它不會給數(shù)據(jù)加鎖,而只是查詢了數(shù)據(jù)行的版本號(這里的版本號屬于自定義的字段,需要在業(yè)務(wù)表的基礎(chǔ)上額外增加一個字段,每當(dāng)更新一次就會自增或者更新)。

在具體更新數(shù)據(jù)的時候更新條件中會添加版本號信息,

  • 當(dāng)版本號沒有變化的時候說明該數(shù)據(jù)行未被更新過,并且也滿足更新條件,所以會更新成功。
  • 當(dāng)版本號有變化的時候,則無法更新數(shù)據(jù)行,因為條件不滿足,此時就需要在進行一次SQL操作。(重新查詢記數(shù)據(jù)行,再次使用新的版本號更新數(shù)據(jù))

實踐

對 for update上鎖進行一次實踐一個student表,其中有一條數(shù)據(jù)

開啟兩個client

第一個開啟事務(wù)后執(zhí)行

select name from student where id = 1 for update;

第二個開啟事務(wù)后執(zhí)行相同的語句,發(fā)現(xiàn)該條數(shù)據(jù)被第一個事務(wù)上鎖阻塞了

這時候第一個事務(wù)執(zhí)行修改并commit;

第二個事務(wù)的select執(zhí)行,發(fā)現(xiàn)阻塞了4秒多

小結(jié)

總的來說,這2種方式都可以支持數(shù)據(jù)庫的并發(fā)更新操作。但具體使用哪一種就得看實際的應(yīng)用場景,應(yīng)用場景對哪種支持更好,并且對性能的影響最小。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • mysql數(shù)據(jù)庫亂碼之保存越南文亂碼解決方法

    mysql數(shù)據(jù)庫亂碼之保存越南文亂碼解決方法

    做一個包含越南文的網(wǎng)站,用戶說在保存包含越南文的文章時,MSYQL亂碼了,看下面的解決方法
    2013-12-12
  • MySQL通配符與正則表達式搜過濾數(shù)據(jù)詳解

    MySQL通配符與正則表達式搜過濾數(shù)據(jù)詳解

    簡單來說,正則表達式就是用來匹配文本的特殊字符串,下面這篇文章主要給大家介紹了關(guān)于MySQL通配符與正則表達式搜過濾數(shù)據(jù)的相關(guān)資料,文中通過實例代碼以及圖文介紹的非常詳細,需要的朋友可以參考下
    2022-09-09
  • mysql 松散的索引掃描(Loose index scan)

    mysql 松散的索引掃描(Loose index scan)

    今天讀《High Performance MySQL》,發(fā)現(xiàn)一個“Loose index scan”,之前完全沒有聽說過。網(wǎng)上查了些資料,這個叫松散的索引掃描(Loose index scan)
    2016-05-05
  • MySQL實戰(zhàn)文章(非常全的基礎(chǔ)入門類教程)

    MySQL實戰(zhàn)文章(非常全的基礎(chǔ)入門類教程)

    半個月時間把MySQL重新鞏固了一遍,梳理了一篇幾萬字超硬核文章,想學(xué)習(xí)mysql的朋友可以看看
    2023-05-05
  • Mysql視圖和觸發(fā)器使用過程

    Mysql視圖和觸發(fā)器使用過程

    這篇文章主要介紹了MySql視圖與觸發(fā)器使用過程,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2022-12-12
  • MySQL雙主(主主)架構(gòu)配置方案

    MySQL雙主(主主)架構(gòu)配置方案

    這篇文章主要介紹了MySQL雙主(主主)架構(gòu)配置方案,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Centos下安裝多個mysql數(shù)據(jù)庫的配置實例詳解

    Centos下安裝多個mysql數(shù)據(jù)庫的配置實例詳解

    在實際的開發(fā)和運維場景中,有時我們需要在同一臺服務(wù)器上運行多個MySQL數(shù)據(jù)庫實例,本文將詳細介紹如何在CentOS系統(tǒng)中安裝并配置多個MySQL數(shù)據(jù)庫實例,希望對大家有所幫助
    2025-04-04
  • mysql中的事務(wù)全方位解析

    mysql中的事務(wù)全方位解析

    這篇文章主要介紹了mysql中的事務(wù)全方位解析,事務(wù)是一種機制、一個操作序列,包含了一組數(shù)據(jù)庫操作命令,并且把所有的命令作為一個整體一起向系統(tǒng)提交或撤銷操作請求,需要的朋友可以參考下
    2023-08-08
  • MySQL8.0與MySQL5.7的區(qū)別詳解

    MySQL8.0與MySQL5.7的區(qū)別詳解

    MySQL8.0是2018年4月20日發(fā)布的全球最受歡迎的開源數(shù)據(jù)庫的一個非常令人興奮的新版本,下面這篇文章主要給大家介紹了關(guān)于MySQL8.0與MySQL5.7區(qū)別的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-01-01
  • mysql注入之長字符截斷,orderby注入,HTTP分割注入,limit注入方式

    mysql注入之長字符截斷,orderby注入,HTTP分割注入,limit注入方式

    這篇文章主要介紹了mysql注入之長字符截斷,orderby注入,HTTP分割注入,limit注入方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11

最新評論

宜川县| 绿春县| 潜江市| 定远县| 闽清县| 平舆县| 博爱县| 绥中县| 定远县| 海南省| 社旗县| 深泽县| 鄂尔多斯市| 新乡县| 敦煌市| 林口县| 临泽县| 杭锦旗| 聊城市| 会同县| 隆子县| 临江市| 徐闻县| 靖江市| 鱼台县| 项城市| 兖州市| 开封县| 垣曲县| 新龙县| 金乡县| 河津市| 同德县| 景泰县| 高安市| 张北县| 皋兰县| 寿宁县| 于田县| 铜鼓县| 曲松县|