與關(guān)系型數(shù)據(jù)庫一樣redis也支持事務(wù)。也就是可以一次執(zhí)行多個命令,本質(zhì)是一組命令的集合。一個事務(wù)中的所有命令都會序列化,按順序地串行化執(zhí)行而不會被其它命令插入,不許加塞。
一個隊列中,一次性、順序性、排他性的執(zhí)行一系列命令。
事務(wù)可以一次執(zhí)行多個命令, 并且?guī)в幸韵聝蓚€重要的保證: 事務(wù)是一個單獨的隔離操作:事務(wù)中的所有命令都會序列化、按順序地執(zhí)行。事務(wù)在執(zhí)行的過程中,不會被其他客戶端發(fā)送來的命令請求所打斷。事務(wù)是一個原子操作:事務(wù)中的命令要么全部被執(zhí)行,要么全部都不執(zhí)行。
使用MULTI開啟一個事務(wù),每當(dāng)添加一個命令,將該命令加入隊列,使用EXEC命令提交時全部執(zhí)行。
使用命令DISCARD取消事務(wù)。
全體連坐的意思就是在一個事務(wù)中有一條語句語法有錯誤就會導(dǎo)致這條事務(wù)全部失效。
命令出錯,所有的命令失效。
意思就是在所有的命令均為正確的情況下,其中一條命令沒有拿到數(shù)據(jù),而導(dǎo)致該條數(shù)據(jù)為空,但是其他命令還是會執(zhí)行成功。
K99不存在,但是其他的命令還是執(zhí)行成功。
WATCH用于監(jiān)控鍵是否發(fā)生改變。被 WATCH 的鍵會被監(jiān)視,并會發(fā)覺這些鍵是否被改動過了。 如果有至少一個被監(jiān)視的鍵在 EXEC 執(zhí)行之前被修改了, 那么整個事務(wù)都會被取消, EXEC 返回nil-reply來表示事務(wù)已經(jīng)失敗。
每次去拿數(shù)據(jù)的時候都認為別人會修改,所以每次在拿數(shù)據(jù)的時候都會上鎖,這樣別人想拿這個數(shù)據(jù)就會block直到它拿到鎖。傳統(tǒng)的關(guān)系型數(shù)據(jù)庫里邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。
每次去拿數(shù)據(jù)的時候都認為別人不會修改,所以不會上鎖,但是在更新的時候會判斷一下在此期間別人有沒有去更新這個數(shù)據(jù),可以使用版本號等機制。樂觀鎖適用于多讀的應(yīng)用類型,這樣可以提高吞吐量。 WATCH使用的是樂觀鎖策略。 一旦執(zhí)行了exec之前加的監(jiān)控鎖都會被取消掉了。或者使用unwatch取消監(jiān)控。
1、WATCH類似于樂觀鎖,在事務(wù)提交時,如果key的值已被別的客戶端改變,整個事務(wù)隊列都不會執(zhí)行。 2、通過WATCH命令在事務(wù)執(zhí)行之前監(jiān)控了多個keys,若在WATCH之后key的值發(fā)生了變化,EXEC命令執(zhí)行的事務(wù)將被放棄。 3、事務(wù)的三階段 開啟–MULTI,入隊,執(zhí)行-EXEC。 4、事務(wù)的三特性 單獨隔離操作、沒有隔離級別的概念、不保證原子性(執(zhí)行失敗、集體連坐、冤頭債主等)。
新聞熱點
疑難解答