redis 中的事務
mysql與redis的區別
mysql redis
開啟 start transaction muitl
語句 普通sql 普通命令
失敗 rollback 回滾 discard 取消
成功 commit exec
127.0.0.1:6379> set num1 200
ok127.0.0.1:6379> set num2 400
ok127.0.0.1:6379> multi
ok127.0.0.1:6379> decrby num2 100
--將語句儲存在佇列queued中,不執行,只有exec才從佇列中拿出來執行
queued
127.0.0.1:6379> incrby num1 100
queued
127.0.0.1:6379> exec
1) (integer) 300
2) (integer) 300
注意:
1 rollback與discard 的區別
如果已經成功執行了1條語句, 第2條語句出錯.
rollback後,前1條的語句影響消失,
discard只是結束本次事務,前1條語句造成的影響仍然還在
127.0.0.1:6379> set num1 200
ok127.0.0.1:6379> set num2 400
ok127.0.0.1:6379> multi
ok127.0.0.1:6379> incrby num1 100
queued
127.0.0.1:6379> decrby num2 aa
queued
127.0.0.1:6379> exec
1) (integer) 300
2) (error) err value is not an integer or out of range
127.0.0.1:6379> get num1
"300"
127.0.0.1:6379> get num2
"400"
127.0.0.1:6379>
2 在mutil後面的語句中, 語句出錯可能有2種情況
1: 語法就有問題,
執行exec時,報錯, 所有語句得不到執行
127.0.0.1:6379> set num1 200
ok127.0.0.1:6379> set num2 400
ok127.0.0.1:6379> multi
ok127.0.0.1:6379> incrby num1 100
queued
127.0.0.1:6379> asdad
(error) err unknown command 'asdad'
127.0.0.1:6379> exec
(error) execabort transaction discarded because of previous errors.
127.0.0.1:6379> get num1
"200"
127.0.0.1:6379> get num2
"400"
2: 語法本身沒錯,但適用物件有問題. 比如set num2 40;decrby num2 aa
exec之後,會執行正確的語句,並跳過有不適當的語句.
127.0.0.1:6379> set num1 200
ok127.0.0.1:6379> set num2 400
ok127.0.0.1:6379> multi
ok127.0.0.1:6379> incrby num1 100
queued
127.0.0.1:6379> decrby num2 aa
queued
127.0.0.1:6379> exec
1) (integer) 300
2) (error) err value is not an integer or out of range
127.0.0.1:6379> get num1
"300"
127.0.0.1:6379> get num2
"400"
127.0.0.1:6379>
redis事務過程:
multi:告訴程式,下面的命令先不要執行,暫時存起來
queued:該命令進入等待執行的事務佇列中
exec:執行事務佇列的命令,按順序執行,順序返回每條命令的執行結果。
鎖
redis的事務中,啟用的是樂觀鎖,只負責監測key沒有被改動.有改動,執行的事務就不成功。
語法watch key1 key2 …
監控乙個或多個鍵,一旦有乙個鍵被修改或者刪除(除了鍵到期自動刪除外),之後事務就不執行,監控一直持續到exec命令
案列買票
--當前票數為1
127.0.0.1:6379> set ticket 1
ok--使用者a的錢500
127.0.0.1:6379> set money 500
ok--設定鎖,如果票數發生變化,下面的事務不執行
127.0.0.1:6379> watch ticket
ok127.0.0.1:6379> multi
ok127.0.0.1:6379> decr ticket
queued
127.0.0.1:6379> decrby money 100
queued
--在exec之前,另乙個使用者b購買了票數,之後當前使用者a執行exec
127.0.0.1:6379> exec
(nil)--表示使用者a的事務沒有生效
另乙個使用者b,在使用者a exec之前,先買了票
127.0.0.1:6379> decr ticket
(integer) 0
127.0.0.1:6379>
Redis09 事務(悲觀鎖 樂觀鎖)
redis事務是乙個單獨的隔離操作 事務中所有的命令都會被序列化 按照順序執行 事務在執行過程中不會被其他客戶端傳送來的命令請求打斷 串聯多個命令防止別的命令插隊 每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖 這樣別人想拿這個資料就會block 阻塞 直到他拿到鎖 傳統的關係型...
Redis事務 事務鎖
一旦成功所有的成功,乙個失敗,所有一些列連續動作都失敗 事務的基本操作 注意 加入事務的命令暫時到任務佇列中,並沒有立即執行,只有執行exec命令才開始執行事務定義過程中發現問題,怎麼辦?discard 事務的工作流程 事務的注意事項 手動進行事務回滾 業務場景1 業務分析 基於特定條件的事務執行 ...
redis11 Redis事務 事務鎖
一旦成功所有的成功,乙個失敗,所有一些列連續動作都失敗 事務的基本操作 multi exec 事務定義過程中發現問題,怎麼辦?discard 事務的工作流程 事務的注意事項 手動進行事務回滾 業務場景1 業務分析 基於特定條件的事務執行 鎖 解決方案 watch key1 key2 unwatch ...