redis 事務(wù) 主要通過(guò)
MULTI, EXEC, DISCARD and WATCH
等命令實(shí)現(xiàn)朋贬。這些命令協(xié)同合作使redis能夠一次性執(zhí)行一組命令梗肝。
特性
- 事務(wù)過(guò)程中的命令按順序依次執(zhí)行长窄,執(zhí)行過(guò)程不受其他客戶端發(fā)出的命令影響,事務(wù)中的一組命令是一個(gè)與外界隔離的操作單元谎柄。
- 命令要么全部執(zhí)行踩麦,要么全不執(zhí)行。事務(wù)中命令的執(zhí)行由EXEC命令觸發(fā)勾徽。
用法
開啟事務(wù) --> MULTI (成功開啟后滑凉,redis client返回`OK`)
執(zhí)行事務(wù) --> EXEC
開啟后輸入的所有命令將進(jìn)入一個(gè)隊(duì)列,輸入EXEC命令后統(tǒng)一執(zhí)行喘帚。若在執(zhí)行EXEC之前執(zhí)行DISCARD命令畅姊,命令隊(duì)列將被清空,終止事務(wù)吹由。
事務(wù)過(guò)程中出現(xiàn)錯(cuò)誤
(即MULTI 和 EXEC命令之間)
- 某條命令未能入隊(duì)
- 執(zhí)行EXEC之后若未,某條命令執(zhí)行出錯(cuò)
第①種情況:redis服務(wù)器拒絕執(zhí)行事務(wù)中的命令,相關(guān)命令不會(huì)入隊(duì)倾鲫,EXEC時(shí)返回異常粗合,并終止事務(wù)萍嬉。
第②種情況:有問(wèn)題的命令會(huì)執(zhí)行失敗,不過(guò)所有其它命令都將正常執(zhí)行隙疚。
Redis為什么沒(méi)有回滾機(jī)制
- EXEC之前壤追,積累命令的時(shí)候,redis在檢測(cè)到的錯(cuò)誤后會(huì)中止事務(wù)
- EXEC之后出現(xiàn)的錯(cuò)誤多是由編碼錯(cuò)誤引起的供屉,這種錯(cuò)誤在開發(fā)過(guò)程中能夠發(fā)現(xiàn)并消除
- 簡(jiǎn)化Redis內(nèi)部設(shè)計(jì)行冰,提高執(zhí)行速度
- 回滾機(jī)制作用有限,并不能彌補(bǔ)編碼錯(cuò)誤
DISCARD命令
用于中止正在進(jìn)行的事務(wù)伶丐。
使用check-and-set實(shí)現(xiàn)的樂(lè)觀鎖
通過(guò)WATCH命令在Redis中實(shí)現(xiàn)check-and-set(CAS)事務(wù)模式悼做。
WATCH命令用于監(jiān)測(cè)鍵的變化,在事務(wù)進(jìn)行過(guò)程中若至少一個(gè)鍵的值發(fā)生改變哗魂,整個(gè)事務(wù)將會(huì)中止肛走,接著EXEC將返回null,表示事務(wù)失敗录别。
WATCH mykey
val = GET mykey
val = val + 1
MULTI
SET mykey $val
EXEC
若在WATCH和EXEC之間朽色,其他客戶端修改了mykey的值,事務(wù)將失敗庶灿。
We just have to repeat the operation hoping this time we'll not get a new race. This form of locking is called optimistic locking and is a very powerful form of locking. In many use cases, multiple clients will be accessing different keys, so collisions are unlikely – usually there's no need to repeat the operation.
我們需要不斷重復(fù)WATCH 和 EXEC之間的操作纵搁,期望這一次不會(huì)出現(xiàn)競(jìng)爭(zhēng)狀態(tài)吃衅。這種鎖機(jī)制功能強(qiáng)大往踢,被稱為樂(lè)觀鎖。在多種使用場(chǎng)景中徘层,多個(gè)客戶端在同一時(shí)刻會(huì)訪問(wèn)不同的鍵峻呕,因此不太可能發(fā)生競(jìng)爭(zhēng)的情況——即,WATCH和EXEC之間的操作通常一次就能完成趣效,不需要自旋瘦癌。
WATCH命令可接收多個(gè)參數(shù),并且可多次調(diào)用
執(zhí)行EXEC之后跷敬,所有鍵將變成UNWATCHed讯私,無(wú)論事務(wù)中止與否∥骺客戶端連接斷開之后同理斤寇。
不帶參數(shù)執(zhí)行UNWATCH命令,會(huì)將所有鍵變?yōu)閁NWATCHed狀態(tài)拥褂。
歡迎到作者github主頁(yè)交流