五月综合激情婷婷六月,日韩欧美国产一区不卡,他扒开我内裤强吻我下面视频 ,无套内射无矿码免费看黄,天天躁,日日躁,狠狠躁

新聞動(dòng)態(tài)

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

發(fā)布日期:2022-03-11 13:34 | 文章來(lái)源:源碼中國(guó)

UPDATE是否會(huì)加鎖?

SQL語(yǔ)句為如下時(shí),是否會(huì)加鎖?

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

答案是不會(huì)

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

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

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

  • 通過(guò)事務(wù)顯式的對(duì)SELECT進(jìn)行加鎖
  • 使用樂(lè)觀鎖機(jī)制

SELECT顯式

加鎖對(duì)SELECT進(jìn)行加鎖的方式有兩種,如下:

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

如果你不使用這2種語(yǔ)句,默認(rèn)情況下SELECT語(yǔ)句是不會(huì)加鎖的。并且對(duì)于上面提到的場(chǎng)景,必須使用排它鎖。另外,上面的2種語(yǔ)句只有在事務(wù)之中才能生效,否則不會(huì)生效。在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ù)時(shí),都使用這樣事務(wù)來(lái)進(jìn)行操作;那么在并發(fā)的情況下,后執(zhí)行的事務(wù)就會(huì)被堵塞,直到當(dāng)前事務(wù)執(zhí)行完成。(通過(guò)鎖把并發(fā)改成了順序執(zhí)行)

使用樂(lè)觀鎖

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

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

  • 當(dāng)版本號(hào)沒(méi)有變化的時(shí)候說(shuō)明該數(shù)據(jù)行未被更新過(guò),并且也滿(mǎn)足更新條件,所以會(huì)更新成功。
  • 當(dāng)版本號(hào)有變化的時(shí)候,則無(wú)法更新數(shù)據(jù)行,因?yàn)闂l件不滿(mǎn)足,此時(shí)就需要在進(jìn)行一次SQL操作。(重新查詢(xún)記數(shù)據(jù)行,再次使用新的版本號(hào)更新數(shù)據(jù))

實(shí)踐

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

開(kāi)啟兩個(gè)client

第一個(gè)開(kāi)啟事務(wù)后執(zhí)行

select name from student where id = 1 for update;

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

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

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

小結(jié)

總的來(lái)說(shuō),這2種方式都可以支持?jǐn)?shù)據(jù)庫(kù)的并發(fā)更新操作。但具體使用哪一種就得看實(shí)際的應(yīng)用場(chǎng)景,應(yīng)用場(chǎng)景對(duì)哪種支持更好,并且對(duì)性能的影響最小。

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

香港服務(wù)器租用

版權(quán)聲明:本站文章來(lái)源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來(lái)源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來(lái)源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來(lái),僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。

相關(guān)文章

實(shí)時(shí)開(kāi)通

自選配置、實(shí)時(shí)開(kāi)通

免備案

全球線路精選!

全天候客戶(hù)服務(wù)

7x24全年不間斷在線

專(zhuān)屬顧問(wèn)服務(wù)

1對(duì)1客戶(hù)咨詢(xún)顧問(wèn)

在線
客服

在線客服:7*24小時(shí)在線

客服
熱線

400-630-3752
7*24小時(shí)客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信
頂部