Redis事務不支持回滾,你竟然還能進行事務控制,牛啊!

redis事務

任何數據庫都要有一套本身的事務控制機制,redis事務是一次能夠執行多個命令,它的本質是一組命令的集合。一個事務中全部的命令都會被序列化,在事務執行的過程當中會按照順序執行隊列中的命令。其它客戶端提交的命令請求會等到事務執行完畢再執行。redis

總的來講:redis事務就是一次性、順序性、排他性的執行一個隊列中的一系列命令,因此Redis實戰筆記你得先看懂!數據庫

redis事務和其它數據庫事務的區別:

一、redis事務是分爲三個階段:開始事務、命令入隊、執行事務。緩存

二、redis事務不具備隔離級別的概念:redis在發送exec命令以前,命令操做只是被放入到隊列緩存當中,並不會被實際執行,所以也就不能相似關係型數據中,在事務內查詢已經變動的操做,事務外的客戶端更不能查詢到事務內的數據。ide

三、redis事務是不保證原子性的:redis事務只保證在命令格式只有在都正確的狀況下才會都執行,要不就都不執行命令。可是事務的總體是不保證原子性的,且沒有回滾,當事務中任意一個命令執行失敗,其他的命令依然會執行。測試

redis命令語法結構:

一、watch key1 key2等等:監視一個或者多個KEY,若是在事務執行的時候,key的值被其它命令改動,則事務被打斷,所有不執行,redis經過該機制完成事務的樂觀鎖。3d

二、multi:用於指定redis事務的開始。code

三、exec:用於指定redis事務開始執行(順序、一次性執行全部事務中的命令),一旦執行exec,前面加的監控鎖都會被取消。blog

四、discard:用於取消事務。放棄事務中的全部命令。隊列

五、unwatch:取消對watch中key的監控。事務


下面咱們經過實例來詳細分析redis事務的執行過程:

例1、redis正常事務流程:

multi
set key1 hello
set key2 free
set key3 world
get key2
exec

Redis事務不支持回滾,你竟然還能進行事務控制,牛啊!

例二、取消事務,代碼以下:

multi
set key1 hello_1
set key2 free_1
set key3 world_1
discard
get key3

Redis事務不支持回滾,你竟然還能進行事務控制,牛啊!

例三、redis事務中某個命令出錯(即不存在的命令,不是語法出錯)時,事務中的全部命令都不會執行,代碼以下:

multi
set key1 hello_1
setok key2 free_1
set key3 world_1
get key3
exec

Redis事務不支持回滾,你竟然還能進行事務控制,牛啊!

例四、redis事務中存在某個命令具備語法性錯誤,執行exec時,其它命令照樣執行,代碼以下:

multi
incr key1 
set key2 free_1
set key3 world_1
get key3
exec

Redis事務不支持回滾,你竟然還能進行事務控制,牛啊!

例5、利用watch監控某個key值的變化,來作redis事務的樂觀鎖。模擬keya帳戶中有100塊錢,keyb帳戶有20塊錢,而後a向b轉了50塊錢。

首先添加測試數據,代碼以下:

set keya 100
set keyb 20 
watch keya 
multi
decrby keya 50
incrby keyb 50
exec 
get keya

Redis事務不支持回滾,你竟然還能進行事務控制,牛啊!

而後,咱們打開第二個客戶端,在事務執行(exec)以前,對a帳戶提早減小50塊錢,看下watch的樂觀鎖機制是否生效,代碼以下:

Redis事務不支持回滾,你竟然還能進行事務控制,牛啊!

在redis事務提交時,若是在事務進入緩存隊列的過程當中,watch命令監控key的值發生了變化,則事務中的命令將都不會被執行。同時返回<nil>提示事務使用者事務執行失敗。

相關文章
相關標籤/搜索