成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

MySQL 鎖機(jī)制存在的價值是什么?

數(shù)據(jù)庫 MySQL
鎖的存在就是為了解決并發(fā)訪問下數(shù)據(jù)的不一致問題。而數(shù)據(jù)庫之所以要提供并發(fā)訪問,是為了提高數(shù)據(jù)庫的運(yùn)行效率。

我們都知道 MySQL 中有各種各樣的鎖,例如:表鎖、間隙鎖、意向鎖、行鎖等等。但你是否想過:為啥 MySQL 要有鎖機(jī)制的存在,它的存在是為了解決什么問題?今天我們就來聊聊這個問題。

沒有鎖的串行世界

我們先假設(shè)這樣一個場景:王五現(xiàn)在賬戶里沒有錢,于是向張三、李四各借 100 元,張三、李四很爽快地答應(yīng)了。如果數(shù)據(jù)庫這時候是串行的,沒有并發(fā)執(zhí)行的線程,那么其轉(zhuǎn)賬示意圖如下所示。

王五借款串行執(zhí)行 - 示意圖

從上圖可以看到:

  • 時間點(diǎn) 1 - 2 的時候,數(shù)據(jù)庫處理了張三的轉(zhuǎn)賬請求,讀取到王五的賬戶余額為 0,并將其余額加 100,此時王五賬戶余額為 100。
  • 時間點(diǎn) 3 - 4 的時候,數(shù)據(jù)庫處理了李四的轉(zhuǎn)賬請求,讀取到王五的賬戶余額為 100,并將其余額加 100,此時王五賬戶余額為 200。
  • 最后,在時間點(diǎn) 5 的時候,王五賬戶余額為 200 元。

可以看到最終王五的賬戶余額是 200 元,轉(zhuǎn)賬是沒問題的。這種數(shù)據(jù)庫訪問方式雖然能保證數(shù)據(jù)一致性,但是每次只能執(zhí)行一個請求,并發(fā)訪問性能太差。

沒有鎖的并行世界

為了提高數(shù)據(jù)庫的并發(fā)訪問性能,MySQL 其實是支持多線程并發(fā)執(zhí)行的。我們上面的例子,如果使用多線程并發(fā)處理,其可能存在的一種情況如下圖所示。

這種情況的處理流程可能是這樣的:

  • 在時間點(diǎn) 1 的時候,線程 A 讀取到王五的賬戶余額為 0。
  • 在時間點(diǎn) 2 的時候,線程 B 讀取到王五的賬戶余額為 0。
  • 在時間點(diǎn) 3 的時候,線程 A 將王五賬戶余額加 100,此時王五賬戶余額為 100。
  • 在時間點(diǎn) 4 的時候,線程 B 將王五賬戶余額加 100,此時王五賬戶余額為 100。
  • 在時間點(diǎn) 5/6 的時候,線程 A、B 都將王五的余額回寫回去,王五賬戶余額為 100。

正常來說,王五最終的賬戶余額應(yīng)該是 200 元,但實際上王五賬戶余額卻只有 100 元。通過分析上面的轉(zhuǎn)賬示意圖,我們會發(fā)現(xiàn)問題的關(guān)鍵點(diǎn)在于時間 4。

在這個時間點(diǎn)時,王五的賬戶余額應(yīng)該是 100 元了,但是數(shù)據(jù)庫線程 B 還是以為王五的賬戶余額是 0 元,所以導(dǎo)致了最后的數(shù)據(jù)不一致。那么如何解決數(shù)據(jù)不一致的問題呢?答案就是:鎖機(jī)制。

有鎖的并行世界

實際上,對于上述的轉(zhuǎn)賬例子,在 InnoDB 中的處理流程如下圖所示。

  • 在時間點(diǎn) 2 的時候,線程 A 讀取到王五的賬戶余額為 0。
  • 在時間點(diǎn) 3 的時候,線程 B 讀取到王五的賬戶余額為 0。
  • 在時間點(diǎn) 4 的時候,線程 A 將王五賬戶余額加 100,并獲取到鎖,此時王五賬戶余額為 100。
  • 在時間點(diǎn) 5 的時候,線程 B 準(zhǔn)備將王五賬戶余額加 100,但此時發(fā)現(xiàn)王五賬戶被鎖了,于是阻塞等待。
  • 在時間點(diǎn) 6 的時候,線程 A 提交事務(wù)。
  • 在時間點(diǎn) 7 的時候,線程 B 重新讀取王五最新的余額為 100 元,并加 100 元,最終在時間點(diǎn) 8 提交事務(wù)。

在時間點(diǎn) 4 的時候,數(shù)據(jù)庫線程 A 對王五賬號余額加鎖,告訴其他線程:我正在更新這條數(shù)據(jù),你們其他人不要動。 在時間點(diǎn) 5 的時候,當(dāng)數(shù)據(jù)庫線程 B 準(zhǔn)備將對王五賬號余額做加 100 操作時,其發(fā)現(xiàn)已經(jīng)有數(shù)據(jù)庫線程 A 在操作了,所以其將線程阻塞了。

等到數(shù)據(jù)庫線程 A 提交事務(wù),釋放鎖之后,數(shù)據(jù)庫線程 B 獲取到對應(yīng)的鎖。這時候數(shù)據(jù)庫線程 B 發(fā)現(xiàn)王五賬號的余額是 100 了,所以就在 100 余額的基礎(chǔ)上做更新,之后提交事務(wù),最終王五賬號的余額就是 200 元。

提示:該例子只是為了粗略說明 InnoDB 是如何通過鎖解決數(shù)據(jù)一致性問題的,在一些細(xì)節(jié)上大家不必對于糾結(jié)。例如這個例子在事務(wù)隔離級別為 READ COMMIT 的時候適用,但是在 REPEATABLE READ 隔離級別時存在問題。

看到這里,相信大家已經(jīng)明白:鎖的存在就是為了解決并發(fā)訪問下數(shù)據(jù)的不一致問題。而數(shù)據(jù)庫之所以要提供并發(fā)訪問,是為了提高數(shù)據(jù)庫的運(yùn)行效率。

責(zé)任編輯:武曉燕 來源: 陳樹義
相關(guān)推薦

2022-01-17 16:02:32

區(qū)塊鏈私有鏈數(shù)據(jù)庫

2024-05-13 12:44:00

InnodbMySQL行級鎖

2020-04-24 15:44:50

MySQL數(shù)據(jù)庫鎖機(jī)制

2019-08-29 15:56:05

商業(yè)價值物聯(lián)網(wǎng)IT

2021-10-11 08:58:34

Goroutine操作系統(tǒng)

2022-08-02 11:29:17

數(shù)據(jù)分析場景RFM

2025-03-27 04:00:00

2022-08-08 11:07:57

5G邊緣移動

2022-09-09 16:18:57

物聯(lián)網(wǎng)工業(yè)物聯(lián)網(wǎng)云平臺

2020-11-04 13:01:38

FastThreadLocalJDK

2010-11-22 14:18:32

MySQL鎖機(jī)制

2020-08-03 14:53:18

區(qū)塊鏈標(biāo)準(zhǔn)化信任互聯(lián)網(wǎng)

2024-03-04 10:00:35

數(shù)據(jù)庫處理機(jī)制

2020-11-12 08:32:11

物聯(lián)網(wǎng)價值鏈IOT

2023-11-09 09:26:22

MySQL存儲引擎

2010-06-07 13:30:15

2023-10-13 13:30:00

MySQL鎖機(jī)制

2013-12-04 16:38:18

Clumsy Ninj手機(jī)游戲

2025-04-02 01:22:44

MySQL樂觀鎖數(shù)據(jù)

2010-09-08 09:40:19

SIP協(xié)議是什么
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 欧美一级二级视频 | 亚洲精品66 | 亚洲天堂av在线 | 亚洲成人精品在线观看 | 成人国产在线观看 | 一级做a爰片性色毛片视频停止 | 成人av免费在线观看 | 伊人免费在线 | 日韩免费| 亚洲日韩中文字幕一区 | 久久精品一级 | 91久久视频 | 亚洲综合资源 | 一级毛片色一级 | 久久久久久综合 | 成人高清在线 | 精品国产一区二区三区久久久四川 | 免费一级做a爰片久久毛片潮喷 | 久久久久91 | 日本a视频 | 性在线| 国产成人a亚洲精品 | 亚洲精选一区二区 | 中文字幕一区在线观看视频 | 欧美日韩中文在线 | 天堂免费看片 | 涩涩99 | 亚洲高清在线 | 国产色婷婷久久99精品91 | 久久九九99 | 成人免费视频 | 国产一区二区日韩 | 亚洲国产精品人人爽夜夜爽 | 国产清纯白嫩初高生视频在线观看 | 免费亚洲视频 | 国产乱码精品一品二品 | 一级黄色片免费在线观看 | 亚洲一区二区三区观看 | 宅男噜噜噜66一区二区 | 日本a在线| 国产97人人超碰caoprom |