redis的事務不具有原子性,在事務中,多條命令執行時,若是其中一條或者多條命令執行失敗,並不會影響其餘命令的執行,以前執行成功的命令也不會回滾,而以後還沒有執行的命令將會繼續執行。redis
命令格式:code
- `MULTI`:開始事務 - `command`:命令入隊 - `EXEC`:執行
127.0.0.1:6379> MULTI OK 127.0.0.1:6379> SET name j QUEUED 127.0.0.1:6379> SET age 11 QUEUED 127.0.0.1:6379> EXEC 1) OK 2) OK 127.0.0.1:6379> GET name "j" 127.0.0.1:6379> get age "11"
命令格式:事務
- `MULTI`:開始事務 - `command`:命令入隊 - `DISCARD`:取消事務
127.0.0.1:6379> MULTI OK 127.0.0.1:6379> SET num 100 QUEUED 127.0.0.1:6379> DISCARD OK 127.0.0.1:6379> GET num (nil)
# 先放入一個String 127.0.0.1:6379> SET name lyxxxx OK # 此時重新設置`name`爲`hash`將會報錯,由於類型不匹配 127.0.0.1:6379> hset name first lin (error) WRONGTYPE Operation against a key holding the wrong kind of value # 此時開始事務 127.0.0.1:6379> MULTI OK 127.0.0.1:6379> set age 25 QUEUED 127.0.0.1:6379> set name first l QUEUED 127.0.0.1:6379> set sex male QUEUED 127.0.0.1:6379> EXEC 1) OK 2) (error) ERR syntax error 3) OK # 從上面的(2)能夠看出`set name first l`執行失敗了,可是(3)仍是成功了 127.0.0.1:6379> get sex "male"
key
改變,取消事務命令格式:get
- `WATCH key [key key ...]`:監聽`key` - `UNWATCH`:取消監聽
監聽name
:hash
127.0.0.1:6379> watch name OK
把name
改變io
127.0.0.1:6379> set name lyxxx2 OK
執行事務,由於name
已經被改變了事務執行失敗了,返回nil
,而且值未被改變command
127.0.0.1:6379> MULTI OK 127.0.0.1:6379> set name lxxxx3 QUEUED # name 已經被改變了,因此事務執行失敗了 127.0.0.1:6379> EXEC (nil) 127.0.0.1:6379> get name "lyxxx2"
取消監聽並再次執行事務,此時事務將會成功error
127.0.0.1:6379> UNWATCH OK 127.0.0.1:6379> MULTI OK 127.0.0.1:6379> set name lxxxx3 QUEUED 127.0.0.1:6379> EXEC 1) OK 127.0.0.1:6379> GET name "lxxxx2"