redis 事務可以一次執行多個命令, 並且帶有以下三個重要的保證:
乙個事務從開始到執行會經歷以下三個階段:
我們可以理解redis事物為乙個指令碼,指令碼中如果出現編譯時錯誤(**有錯),整條指令碼都不會被執行,並且並拋棄。指令碼中如果出現執行時錯誤(1/0等邏輯錯誤),除了該條指令其他的語句依然會被執行。
127.0.0.1:6379> multi #開啟事務
ok127.0.0.1:6379>
set k1 v1
queued
127.0.0.1:6379>
set k2 v2
queued
127.0.0.1:6379>
set k3 v3
queued
127.0.0.1:6379>
exec
#執行事務
1) ok
2) ok
3) ok
127.0.0.1:6379> get k1 #可以拿到
"v1"
127.0.0.1:6379> get k3
"v3"
127.0.0.1:6379> multi #開啟事務
ok127.0.0.1:6379>
set k4 v4
queued
127.0.0.1:6379> discard #放棄事務
ok127.0.0.1:6379> get k4 #拿不到k4
(nil)
127.0.0.1:6379> multi #開啟事務
ok127.0.0.1:6379>
set k4 v4
queued
127.0.0.1:6379> se k5 v5
(error) err unknown command
`se`
, with args beginning with: `k5`
, `v5`
, #語法錯誤
127.0.0.1:6379>
set k6 v6
queued
127.0.0.1:6379>
exec
#執行(error) execabort transaction discarded because of previous errors. #所有事務都不會執行
127.0.0.1:6379> get k6 #拿不到
(nil)
127.0.0.1:6379> multi #開啟事務
ok 127.0.0.1:6379>
set k7 v7
queued
127.0.0.1:6379> incr k7 #對字串進行增加一操作(邏輯錯誤)
queued
127.0.0.1:6379>
set k8 v8
queued
127.0.0.1:6379>
exec
#其他的會被執行
1) ok
2)(error) err value is not an integer or out of range
3) ok
127.0.0.1:6379> get k8
"v8"
悲觀鎖:
樂觀鎖:
我們在redis中可以通過watch來實現對乙個物件的樂觀鎖,通過watch來獲取乙個屬性的version。
下面是具體事例:
127.0.0.1:6379>
set money 100
ok127.0.0.1:6379>
set out 0
ok127.0.0.1:6379>
watch money
ok127.0.0.1:6379> multi
ok127.0.0.1:6379> decrby money
(error) err wrong number of arguments for
'decrby'
command
127.0.0.1:6379> discard
ok127.0.0.1:6379>
watch money #監控money的值
ok127.0.0.1:6379> multi #開啟事務
ok127.0.0.1:6379> decrby money 30 #減少餘額30
queued
127.0.0.1:6379> incrby out 20 #增加支出20
queued
127.0.0.1:6379>
exec
#執行1)
(integer) 70
2)(integer) 20
127.0.0.1:6379>
watch money #先檢視下money
ok127.0.0.1:6379> multi #開啟一下
ok127.0.0.1:6379> incrby money 50
queued
這時我們不提交事務,我們模擬一下另外乙個執行緒對money進行改變的場景,這裡第二個執行緒將這個錢數減少了20
127.0.0.1:6379> get money
"70"
127.0.0.1:6379> decrby money 50
(integer) 20
再執行下第乙個執行緒的事務
127.0.0.1:6379> get money
queued
127.0.0.1:6379>
exec
(nil)
這裡執行出現nil,這就代表著樂觀鎖生效了,事務沒有執行成功。
那假如我們在第二個執行緒也對money做了一些改變,但是最終值與原來第乙個執行緒watch時的值相同呢?
第乙個執行緒,
127.0.0.1:6379>
set jj 80
ok127.0.0.1:6379>
watch jj #加鎖
ok127.0.0.1:6379> multi
ok127.0.0.1:6379> incrby jj 30 #這裡第二個執行緒先對他增加50,再減少50
queued
127.0.0.1:6379>
exec
#執行(nil)
發現不大行,redis的事務處理與其值沒有很大的關係。 Redis基礎學習(五) Redis中的事務
redis的單條命令保證原子性,事務不保證原子性!事物的本質 一組命令的集合,乙個事務中所有的命令都會被序列化,在事務執行的過程中,會按照順序進行執行!事務的特性 一次性 單次 順序性 有順序 排他性 排除干擾 redis的事務沒有隔離級別的概念!所有的命令都在事務中,並沒有被立刻執行,只有在發起執...
五 Redis入門事務
是什麼 可以一次執行多個命令,本質是一組命令的集合。乙個事務中的 所有命令都會序列化,按順序地序列化執行而不會被其它命令插入,不許加塞 能幹嘛 乙個佇列中,一次性 順序性 排他性的執行一系列命令 怎麼玩 case1正常執行 開啟 multi 執行一堆,例如set k1 v1 set k2 v2 提交...
Redis筆記 五 之事務
redis 事務本質 一組命令的集合!乙個事務中的所有命令都會被序列化,在事務執行過程的中,會按 照順序執行!一次性 順序性 排他性!執行一些列的命令!佇列 set set set 執行 redis事務沒有沒有隔離級別的概念!所有的命令在事務中,並沒有直接被執行!只有發起執行命令的時候才會執行!ex...