最新国产好看的视频,伊人天堂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關鍵字就會全程加鎖,針對上面的MySQL語句而言,其實并不只是一條UPDATE語句,而應該類似于兩條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種:

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

SELECT顯式

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

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

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

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ù)時,都使用這樣事務來進行操作;那么在并發(fā)的情況下,后執(zhí)行的事務就會被堵塞,直到當前事務執(zhí)行完成。(通過鎖把并發(fā)改成了順序執(zhí)行)

使用樂觀鎖

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

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

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

實踐

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

開啟兩個client

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

select name from student where id = 1 for update;

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

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

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

小結(jié)

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

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

相關文章

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

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

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

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

    簡單來說,正則表達式就是用來匹配文本的特殊字符串,下面這篇文章主要給大家介紹了關于MySQL通配符與正則表達式搜過濾數(shù)據(jù)的相關資料,文中通過實例代碼以及圖文介紹的非常詳細,需要的朋友可以參考下
    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)文章(非常全的基礎入門類教程)

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

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

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

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

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

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

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

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

    mysql中的事務全方位解析

    這篇文章主要介紹了mysql中的事務全方位解析,事務是一種機制、一個操作序列,包含了一組數(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ù)庫的一個非常令人興奮的新版本,下面這篇文章主要給大家介紹了關于MySQL8.0與MySQL5.7區(qū)別的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-01-01
  • mysql注入之長字符截斷,orderby注入,HTTP分割注入,limit注入方式

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

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

最新評論

关岭| 喀什市| 浦江县| 营山县| 丹寨县| 水城县| 资阳市| 建德市| 山西省| 玉环县| 东乌| 北票市| 石河子市| 阜新| 利川市| 奉贤区| 洛扎县| 襄樊市| 宁城县| 徐闻县| 新晃| 富阳市| 理塘县| 商都县| 资中县| 井陉县| 佛山市| 旬邑县| 辽宁省| 保康县| 曲松县| 河北区| 四平市| 崇仁县| 南丹县| 额尔古纳市| 县级市| 孟津县| 天祝| 河曲县| 北票市|