1、redis與 mysql事務的對比:
mysql
redis
開啟start transaction
multi
語句普通sql
普通命令
失敗rollback 回滾
discard 取消
成功commit
exec
2、rollback與discard 的區別:
如果已經成功執行了2條語句, 第3條語句出錯.
rollback後,前2條的語句影響消失.
discard只是結束本次事務,前2條語句造成的影響仍然還在
3、在mutil後面的語句中, 語句出錯可能有2種情況
1: 語法就有問題, exec時,報錯, 所有語句得不到執行
2: 語法本身沒錯,但適用物件有問題. 比如 zadd 操作list物件,exec之後,會執行正確的語句,並跳過有不適當的語句.(如果zadd 操作list這種事怎麼避免? 這一點,由程式設計師負責)
比如: set zhangsan 700 set lisi 200 multi decrby zhangsan 100 incr lisi 100 exec 此時 incr lisi 100 語法出錯,兩條語句都不能執行,zhangsan: 700, lisi: 200
set zhangsan 700 set lisi 200 multi decrby zhangsan 100 sadd lisi 100 exec 此時 sadd lisi 100 錯將lisi作為集合執行,exec後跳過此句,zhangsan: 600, lisi: 200
4、redis的樂觀鎖:(watch)
思考:
我正在買票
ticket -1 , money -100
而票只有1張, 如果在我multi之後,和exec之前, 票被別人買了---即ticket變成0了.
我該如何觀察這種情景,並不再提交
悲觀的想法:
世界充滿危險,肯定有人和我搶, 給 ticket上鎖, 只有我能操作. [悲觀鎖]
樂觀的想法:
沒有那麼人和我搶,因此,我只需要注意,
--有沒有人更改ticket的值就可以了 [樂觀鎖]
redis的事務中,啟用的是樂觀鎖,只負責監測key沒有被改動.
具體的命令---- watch命令
例: watch ticket
multi
decr ticket
decrby money 100 若此時在另乙個埠中執行decr ticket,改變了ticket
exec // 返回nil,說明監視的ticket已經改變了,事務就取消了.
(2)watch key1 key2 ... keyn:監聽key1 key2..keyn有沒有變化,如果有變, 則事務取消
(3)unwatch : 取消所有watch監聽
redis 樂觀鎖與事務
一 樂觀鎖 先表明態度,樂觀鎖並不是乙個好的實現方式!在mysql中,我們一般通過給資料表額外建乙個version欄位,讀的時候讀出verson,更新的時候 v2 versin 1,語句為 update set version version 1 where id and version v2 只要...
Redis 事務(悲觀鎖 樂觀鎖)
1 定義 redis事務是乙個單獨的隔離操作 事務中所有的命令都會被序列化 按照順序執行 事務在執行過程中不會被其他客戶端傳送來的命令請求打斷 2 作用 串聯多個命令防止別的命令插隊 multi 輸入開始命令 exec 執行命令 discard 放棄組隊 刪除掉 3 注意事項 1 multi 命令不...
Redis 樂觀鎖控制事務
redis對事務的支援比較簡單。redis只能保證乙個客戶端發起的事務命令可以執行,中間不會插入其他事務。因為redis是單執行緒的,所以做到上面這點很容易。一般redis接受到客戶端的命令後會立即執行,但是如果客戶端發起multi命令,redis不會立即執行,而是讓當前連線進入事務上下文,把命令放...