<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          并發(fā)編程的原子性 != 事務(wù)ACID的原子性

          共 865字,需瀏覽 2分鐘

           ·

          2023-01-09 17:31


          關(guān)于原子性,很多人在多個地方都聽說過,大家也都背的很熟悉。

          在事務(wù)的ACID中,有原子性的概念,在并發(fā)編程的原子性、可見性、有序性中也有原子性的概念。

          有人認為他們是一樣的,甚至很多人在說原子性的時候也都是這么說的:


          原子性是指事務(wù)是一個不可再分割的工作單元,事務(wù)中的操作要么都發(fā)生,要么都不發(fā)生。

          但是,其實,雖然都叫原子性,但是此原子性非彼原子性

          在數(shù)據(jù)庫中的原子性,確實是一個不可拆分的工作單元,要么都執(zhí)行,要么都不執(zhí)行。因為事務(wù)可以Commit、也可以Rollback。

          但是在并發(fā)編程中,一個操作是沒辦法rollback的,并且線程在執(zhí)行過程中也是有可能失敗的,失敗了是沒辦法回滾的,難道就說一個操作沒辦法保證原子性了么?

          所以,在并發(fā)編程中,我們把一個或者多個操作在 CPU 執(zhí)行的過程中不被中斷的特性稱為原子性。這里的原子性是通過加鎖的方式來保證的,其實保證的就是一列操作,不可以被拆分執(zhí)行,即執(zhí)行過程中,需要互斥排他,不能有其他線程進行執(zhí)行。

          舉一個例子來說明一下這兩個原子性的區(qū)別。

          Redis中的Lua腳本到底能不能保證原子性?

          網(wǎng)上很多文章,有人說能,有人說不能。要我說,都對,也都不對。就是因為因為大家搞混了這兩個原子性的區(qū)別。

          我們都知道,當(dāng)我們想要在一個事務(wù)中執(zhí)行多個命令的時候,會選擇使用Lua腳本。

          Redis會將一個要執(zhí)行的Lua腳本封裝成一個單獨的事務(wù),而腳本執(zhí)行器在執(zhí)行這個事務(wù)的過程中,

          如果有其他客戶端請求的時候,會把它暫存起來,等腳本處理完以后,才會再把被暫存的請求恢復(fù)執(zhí)行。

          這樣就可以保證整個腳本是作為一個整體執(zhí)行的,中間不會被其他命令插入,這就是所謂的原子性中的”不可拆分”特性。

          但是,如果事務(wù)執(zhí)行過程中命令產(chǎn)生錯誤,事務(wù)是不會回滾的,也不會影響后續(xù)命令的執(zhí)行。

          也就是說,Redis保證以原子方式執(zhí)行Lua腳本,但是不保證腳本中所有操作要么都執(zhí)行或者都會滾。

          那就意味著,Redis中Lua腳本的執(zhí)行,可以保證并發(fā)編程中不可再拆分的這個原子性,但是沒有保證數(shù)據(jù)庫ACID中要么都執(zhí)行要么都會滾的這個原子性。

          瀏覽 25
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产在线播放福利 | 青青草视频在线观看免费 | 中文字幕综合在线 | 成年人视频中文字幕在线播放 | 性色五月天 |