<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>

          《redis in action》redis事務(wù)

          共 1527字,需瀏覽 4分鐘

           ·

          2021-04-02 13:34

          在一些時(shí)候我們需要對(duì)redis中的多個(gè)數(shù)據(jù)進(jìn)行復(fù)制或者刪除等操作,但是這些命令不是一起執(zhí)行的,他們都是單獨(dú)的一個(gè)命令。所以redis提供了一些命令讓多個(gè)操作一起執(zhí)行,并不被中斷。這些命令有:watch、multi、exec、unwatch和discard。
          現(xiàn)在,我們討論一下最簡(jiǎn)單的redis事務(wù),也就是multi和exec命令。
          1.什么是redis基礎(chǔ)事務(wù)
          在redis中,基礎(chǔ)事務(wù)就是通過(guò)multi和exec指令提供的一個(gè)客戶端去執(zhí)行多個(gè)客戶端命令,比如A、B、C這樣,但是其他的客戶端是不能中斷該客戶端提交的命令執(zhí)行。redis中的事務(wù)和關(guān)系型數(shù)據(jù)庫(kù)中的事務(wù)不是一回事,關(guān)系型數(shù)據(jù)庫(kù)事務(wù)可以讓指令部分執(zhí)行,回滾和提交,但是在redis事務(wù)執(zhí)行完畢之前,其中每個(gè)命令都是multi/exec事務(wù)執(zhí)行過(guò)程的一部分。在該客戶端執(zhí)行完畢之后,其他的客戶端才能去操作。我們可以理解為指令串行的。
          基于上述描述,《reids in action》中,編寫(xiě)了多線程情況下對(duì)一個(gè)redis的string進(jìn)行的自增操作,這塊對(duì)比肯定是比較明顯的,事務(wù)性的操作是不會(huì)導(dǎo)致數(shù)據(jù)的算數(shù)結(jié)果錯(cuò)誤的。
          Redis中的事務(wù)其實(shí)是將命令進(jìn)行了緩存,然后當(dāng)我們執(zhí)行exec命令的時(shí)候才進(jìn)行統(tǒng)一執(zhí)行的。那么就會(huì)有以下三個(gè)問(wèn)題。
          1.當(dāng)先redis發(fā)送待執(zhí)行的命令的時(shí)候,如果發(fā)生語(yǔ)法錯(cuò)誤,那么所有的命令都不會(huì)被執(zhí)。說(shuō)明的就是我們客戶端發(fā)送命令到服務(wù)端,如果服務(wù)端發(fā)現(xiàn)有命令發(fā)生了錯(cuò)誤,那么整個(gè)緩存的命令都將不會(huì)執(zhí)行。
          2.在緩存命令執(zhí)行過(guò)程中發(fā)生錯(cuò)誤,那么已經(jīng)執(zhí)行成功的命令不會(huì)回滾。發(fā)生錯(cuò)誤的命令會(huì)在最后進(jìn)行提示。如下圖所示:
          3.樂(lè)觀鎖失敗
          redis事務(wù)和樂(lè)觀鎖一起使用的時(shí)候,事務(wù)就可以變成有條件的提交。但是有以下注意事項(xiàng),因?yàn)閞edis的樂(lè)觀鎖是使用watch命令。

          WATCH命令必須在MULTI命令之前執(zhí)行. WATCH命令可以執(zhí)行多次.
          WATCH命令可以指定樂(lè)觀鎖的多個(gè)key,如果在事務(wù)過(guò)程中,任何一個(gè)key被其他客戶端改變,則當(dāng)前客戶端的樂(lè)觀鎖失敗,事務(wù)提交時(shí),將丟棄所有命令序列.
          多個(gè)客戶端的WATCH命令可以指定相同的key.
          WATCH命令指定樂(lè)觀鎖后,可以接著執(zhí)行MULTI命令進(jìn)入事務(wù)上下文,也可以在WATCH命令和MULTI命令之間執(zhí)行其他命令. 具體使用方式取決于場(chǎng)景需求,不在事務(wù)中的命令將立即被執(zhí)行.

          如果WATCH命令指定的樂(lè)觀鎖的key,被當(dāng)前客戶端改變,在事務(wù)提交時(shí),樂(lè)觀鎖不會(huì)失敗.
          如果WATCH命令指定的樂(lè)觀鎖的key具有超時(shí)屬性,并且該key在WATCH命令執(zhí)行后, 在事務(wù)提交命令EXEC執(zhí)行前超時(shí), 則樂(lè)觀鎖不會(huì)失敗.如果該key被其他客戶端對(duì)象修改,則樂(lè)觀鎖失敗.
          ————————————————
          版權(quán)聲明:本文為CSDN博主「azurelaker」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
          原文鏈接:https://blog.csdn.net/azurelaker/article/details/85045220
          上述的注意事項(xiàng)說(shuō)的很明白,樂(lè)觀鎖就是為了保障事務(wù)的安全而產(chǎn)生的,如果其他客戶端修改了watch元素的key,那么當(dāng)前的緩存的命令就會(huì)失效,但是如果事務(wù)自己本身修改了watch的key,那就不會(huì)失敗,當(dāng)然還有超時(shí)屬性的情況,在超時(shí)時(shí)間內(nèi)是不會(huì)失敗的。
          瀏覽 36
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <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>
                  国产熟妇久久77777 | 欧美精品一区二区少妇免费A片 | 天天做天天干天天 | 天堂综合精品无码 | 爱搞搞,色 |