mysql:acid。要麼同時成功,要麼同時失敗。
redis事務本質:一組命令的集合。乙個事務中的所有命令都會被序列化,在事務執行過程中,會按照順序執行。一次性,順序性,排他性,執行一系列的命令。
redis事務沒有隔離級別的概念
所有的命令在事務中,並沒有直接被執行。只有發起執行命令的時候才會執行。(exec)
redis單條命令是保證原子性的,但是事務不保證原子性。(重點)
redis的事務:
正常執行事務
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> get k1 # 命令入隊
queued
127.0.0.1:6379> get k2 # 命令入隊
queued
127.0.0.1:6379> get k9 # 命令入隊
queued
127.0.0.1:6379> setrange k1 0 w # 命令入隊
queued
127.0.0.1:6379>
exec
# 執行事務
1) ok
2) ok
3)"v1"
4)"v2"
5)(nil)
6)(integer) 2
放棄事務 discard
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 k1 v1
queued
127.0.0.1:6379> getset k1 # 錯誤的命令 getset k1 v1
(error) err wrong number of arguments for
'getset'
command
127.0.0.1:6379>
set k2 v2
queued
127.0.0.1:6379>
exec
# 執行事務
(error) execabort transaction discarded because of previous errors.
127.0.0.1:6379> get k2 # 所有的命令都不會被執行
(nil)
執行時異常(1/0)如果事務佇列中存在一些語法性錯誤,那麼執行命令的時候,其他命令是可以正常執行的,錯誤命令丟擲異常
127.0.0.1:6379>
set k1 "lyt"
ok127.0.0.1:6379> multi
ok127.0.0.1:6379> incr k1
queued
127.0.0.1:6379>
set k2 v2
queued
127.0.0.1:6379>
exec
# 雖然第一條命令報錯了,但是依舊正常執行成功了
1)(error) err value is not an integer or out of range
2) ok
127.0.0.1:6379> get k2
"v2"
監控 watch(面試常問)樂觀鎖:
悲觀鎖:
redis的監視測試正常執行成功
127.0.0.1:6379>
set money 100
ok127.0.0.1:6379>
set out 0
ok127.0.0.1:6379>
watch money # 監視money
ok127.0.0.1:6379> multi # 監視正常結束,資料期間沒有發生變動,這個時候就正常執行成功
ok127.0.0.1:6379> decrby money 20
queued
127.0.0.1:6379> incrby out 20
queued
127.0.0.1:6379>
exec
1)(integer) 80
2)(integer) 20
測試多執行緒修改值,使用watch可以當做redis的樂觀鎖操作
127.0.0.1:6379>
watch money # 監視 money
ok127.0.0.1:6379> multi
ok127.0.0.1:6379> decrby money 10
queued
127.0.0.1:6379> incrby out 10
queued
127.0.0.1:6379>
exec
# 執行之前,另外乙個執行緒,修改了我們監視的值。這種情況就會導致事務執行失敗
(nil)
如果發現事務執行失敗:
先解鎖(unwatch)
獲取最新的值,再次監視(加鎖)
比對監視的值,是否發生了變化?如果沒有變化,事務可以執行成功,否則,事務執行失敗。再重複上述步驟。
Redis 事務(悲觀鎖 樂觀鎖)
1 定義 redis事務是乙個單獨的隔離操作 事務中所有的命令都會被序列化 按照順序執行 事務在執行過程中不會被其他客戶端傳送來的命令請求打斷 2 作用 串聯多個命令防止別的命令插隊 multi 輸入開始命令 exec 執行命令 discard 放棄組隊 刪除掉 3 注意事項 1 multi 命令不...
Redis09 事務(悲觀鎖 樂觀鎖)
redis事務是乙個單獨的隔離操作 事務中所有的命令都會被序列化 按照順序執行 事務在執行過程中不會被其他客戶端傳送來的命令請求打斷 串聯多個命令防止別的命令插隊 每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖 這樣別人想拿這個資料就會block 阻塞 直到他拿到鎖 傳統的關係型...
Redis鎖,悲觀鎖和樂觀鎖
樂觀鎖開啟事務前,設定對資料的監聽 watch exec時,如果發生資料發生過修改,作用於改資料的事務會自動取消 discard 事務exec後,無論成敗,監聽會被移除 悲觀鎖每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖。場景 如果專案中使用了快取且對快取設定了超時時間。當併發...